40

次のようなchar配列[]を変換したい:

char myarray[4] = {'-','1','2','3'}; //where the - means it is negative

したがって、整数である必要があります。Cの標準ライブラリを使用する-1234 。私はそれを行うためのエレガントな方法を見つけることができませんでした。

確かに「\0」を追加できます。

4

5 に答える 5

88

私は個人的に機能が好きではありませんatoi。私は提案しsscanfます:

char myarray[5] = {'-', '1', '2', '3', '\0'};
int i;
sscanf(myarray, "%d", &i);

それは非常に標準的で、stdio.hライブラリにあります:)

そして、私の意見では、それはあなたの数字列の任意のフォーマットよりもはるかに多くの自由をatoi可能にし、そしておそらく最後に数字以外の文字も可能にします。

編集私はちょうどそれを行うための3つの異なる方法を説明し比較するサイトで この素晴らしい質問atoiを見つけました- 、、。また、(実際には、関数のファミリー全体)についてのより詳細な洞察があります。sscanfstrtolsscanf*scanf

EDIT2 個人的にこの機能が嫌いなのは私だけではないようですatoi。この関数は非推奨であり、新しいコードでは使用しないことを説明する回答へのリンクを次に示します。atoi

于 2012-04-18T07:14:34.530 に答える
12

atoiだけを使ってみませんか?例えば:

char myarray[4] = {'-','1','2','3'};

int i = atoi(myarray);

printf("%d\n", i);

予想通り、私に与えます:

-123

更新:なぜそうではないか-文字配列はnullで終了しません。ドー!

于 2012-04-18T07:07:18.120 に答える
3

配列を文字列に変換せずに文字配列自体を処理することはそれほど難しくありません。特に、文字配列の長さがわかっているか、簡単に見つけられる場合。文字配列の場合、長さは配列定義と同じスコープで決定する必要があります。例:

size_t len sizeof myarray/sizeof *myarray;

もちろん、文字列についてはstrlen利用できます。

長さがわかっていれば、文字配列であるか文字列であるかに関係なく、次のような短い関数を使用して文字値を数値に変換できます。

/* convert character array to integer */
int char2int (char *array, size_t n)
{    
    int number = 0;
    int mult = 1;

    n = (int)n < 0 ? -n : n;       /* quick absolute value check  */

    /* for each character in array */
    while (n--)
    {
        /* if not digit or '-', check if number > 0, break or continue */
        if ((array[n] < '0' || array[n] > '9') && array[n] != '-') {
            if (number)
                break;
            else
                continue;
        }

        if (array[n] == '-') {      /* if '-' if number, negate, break */
            if (number) {
                number = -number;
                break;
            }
        }
        else {                      /* convert digit to numeric value   */
            number += (array[n] - '0') * mult;
            mult *= 10;
        }
    }

    return number;
}

上記は、いくつかの追加の条件が含まれている、単なる標準のcharからintへの変換アプローチです。digitsとに加えて、迷子の文字を処理するため'-'の唯一の秘訣は、数字の収集を開始するタイミングと停止するタイミングを賢明に選択することです。

digits最初のに遭遇したときに変換のために収集を開始した場合、最初のまたはdigitに遭遇したときに変換が終了します。これにより、(eg)などのインデックスに関心がある場合に変換がはるかに便利になります。'-'non-digitfile_0127.txt

その使用の簡単な例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int char2int (char *array, size_t n);

int main (void) {

    char myarray[4] = {'-','1','2','3'}; 
    char *string = "some-goofy-string-with-123-inside";
    char *fname = "file-0123.txt";

    size_t mlen = sizeof myarray/sizeof *myarray;
    size_t slen = strlen (string);
    size_t flen = strlen (fname);

    printf ("\n myarray[4] = {'-','1','2','3'};\n\n");
    printf ("   char2int (myarray, mlen):  %d\n\n", char2int (myarray, mlen));

    printf (" string = \"some-goofy-string-with-123-inside\";\n\n");
    printf ("   char2int (string, slen) :  %d\n\n", char2int (string, slen));

    printf (" fname = \"file-0123.txt\";\n\n");
    printf ("   char2int (fname, flen)  :  %d\n\n", char2int (fname, flen));

    return 0;
}

注:'-'区切られたファイルインデックス(など)に直面した場合、結果を否定するのはあなた次第です。(たとえば、最初の場所が2番目の場所に戻る場合file-0123.txtと比較して)。file_0123.txt-123123

出力例

$ ./bin/atoic_array

 myarray[4] = {'-','1','2','3'};

   char2int (myarray, mlen):  -123

 string = "some-goofy-string-with-123-inside";

   char2int (string, slen) :  -123

 fname = "file-0123.txt";

   char2int (fname, flen)  :  -123

注:問題を引き起こす可能性のあるコーナーケースなどは常にあります。atoiこれは、すべての文字セットなどで100%防弾になることを意図したものではありませんが、代わりに、圧倒的多数の時間で機能し、またはstrtolなどで必要な文字列への最初の解析や変換なしで、追加の変換の柔軟性を提供します。

于 2015-05-23T22:05:55.057 に答える
2

したがって、アイデアは、文字番号(一重引用符、たとえば「8」)を整数式に変換することです。たとえば、char c = '8'; int i =c-'0'//整数8を生成します。そして、ループで行われる908 = 9 * 100 + 0 * 10 + 8の原則によって、変換されたすべての数値を合計します。

char t[5] = {'-', '9', '0', '8', '\0'}; //Should be terminated properly.

int s = 1;
int i = -1;
int res = 0;

if (c[0] == '-') {
  s = -1;
  i = 0;
}

while (c[++i] != '\0') { //iterate until the array end
  res = res*10 + (c[i] - '0'); //generating the integer according to read parsed numbers.
}

res = res*s; //answer: -908
于 2015-05-23T15:46:13.763 に答える
0

質問の内容ではありませんが、nullで終了するstdinから読み込まれたchar配列に対して、@RichDrummondの回答を使用しました。

char *buff;
size_t buff_size = 100;
int choice;
do{
    buff = (char *)malloc(buff_size *sizeof(char));
    getline(&buff, &buff_size, stdin);
    choice = atoi(buff);
    free(buff);
                    
}while((choice<1)&&(choice>9));
于 2020-07-02T20:57:57.010 に答える