1

私はCに比較的慣れていないので、なぜatoiこの状況で問題が発生するのか興味があります。基本的なことを理解していないような気がします。これが私のサンプルコードです:

int main()
{
    char last[3];
    last[2]='\0';
    uint16_t num1;
    uint16_t num2;

    // I read in num1 and num2 from a file and do an integer operation on them. bigarray is the file contents. bigarray[i] is a integer
    num1=bigarray[i] - 1;
    num2=bigarray[i+1] - 1;
    last[0]=(char)num1;
    last[1]=(char)num2;
    printf("%i\n:", atoi(last));
}

印刷し last[0]last[1]別々に印刷すると、正しい値が得られます。私が印刷するときatoi(last)、それは私に与えます0

なぜこの状況でatoi私に与えるのです0か、そしてどうすればそれを修正できますか?

4

5 に答える 5

7

atoiASCII文字を想定しているため、配列がである場合、たとえばlast[0] = 1、およびである場合、それが印刷される場合よりも、last[1] = 2文字が検出されません 。last[0] = '1'last[1] = '2'12

この特定のケースでは、次の方法でそれを実現できます。

last[0]='0' + num1;
last[1]='0' + num2;

(仮定しnum1num20〜9の間)

アイデアを説明するための短い編集:

'0'数字(0x30)から'9'(0x39)のASCII値は連続しているため、 (0x30)に追加すると(0x30)になり、0(0x30)に追加すると(0x32)になります。'0''0'2'0''2'

于 2012-05-29T04:10:47.267 に答える
0

配列を印刷しようとしているからだと思います。単一の値を印刷しますか?または、forループを使用するすべての値?

于 2012-05-29T04:11:27.320 に答える
0

これlast[0]=(char)num1;は数値を文字にキャストするだけですが、その値は維持されます(num116ビット長であるため、状況によっては切り捨てられます)。

したがって、を使用する前に数値をそのchar*表現に変換するのではなくatoi、さまざまなタイプに数値をキャストするだけです(ASCIIエンコーディングは含まれません)。

于 2012-05-29T04:11:45.007 に答える
0

atoi()数値ではなく、nullで終了するASCII文字列で機能します。あなたはおそらくただ欲しいprintf("%d%d\n", num1, num2);

charに数値を割り当てることは、その文字列をASCII10進数としてのその数値の読み取り可能な表現にすることと同じではありません。そのためには、試してみてくださいsprintf()

于 2012-05-29T04:12:15.637 に答える
0

これをチェックしてください

char a=48;
printf("%i",a); //this would give you an output of 48
printf("%c",a); //this would give you an output of 0
printf("%c",48); //this would give you an output of 48
printf("%i",atoi(a)); //this would give you an output of 0
printf("%i",atoi("50")); //this would give you an output of 2

atoi()関数では、値がASCII形式である必要があります。

意味文字「0」は整数48に等しい。
意味文字「1」は整数49に等しい
。意味文字「2」は整数50に等しい
。...など。

型キャストを行うときは、データサイズを変更するだけです。あなたのコードからなど

...
last[0]=(char)num1;
...

num1からのデータのサイズは、文字型変数に格納する前に文字データ型に適合できるように縮小されますが、値はnum1に格納されているものと同じです。

したがって、それでも実行する予定がある場合は、これらの行を変更するだけです。

...
last[0]=(char)num1;
last[1]=(char)num1;
...

...
last[0]=(char)num1+48;
last[1]=(char)num2+48;
...

またはこれでさえ

...
last[0]=num1+48;
last[1]=num2+48;
...

上記のコード行を変更した後、コードを使用して値を正しく表示できます

...
printf("%i\n:", atoi(last));
...
于 2012-05-29T04:59:24.277 に答える