-5

Visual C 6 を使用しています

文字配列 (一重引用符) を整数に変換し、値を 1 増やしてから、結果を別の文字配列に格納しようとしています。

しかし、文字に戻すと予期しない値が得られます..

これが私のコードです

   char char_array[4];
   char_array[0] = '1';
   char_array[1] = '2';
   char_array[2] = '3';
   char_array[3] = '\0';  //Terminating character

   int my_number = atoi(char_array);  
   printf("my_number = %d" , my_number);   // output is 123

   my_number++;    // works and my_number is incremented =124
   printf("now: my_number = %d" , my_number);   // output is 124


   char result[4];  //declared to store the result

   result = itoa(my_number);  // Output is unexpected.

   printf("%c", result[0]);    // Output is  2  instead of 1
   printf("%c", result[1]);    // Output is  2
   printf("%c", result[2]);    // Output as  3   instead of 4

関数itoa()は元の値123を何らかの形で知っているようで、奇妙な方法でその値をインクリメントしたことを知っています..しかし、加算は間違った桁に行われます。最下位桁に 1 を加算する代わりに、最上位桁に 1 を加算します。

4

4 に答える 4

4

あなたのコンパイラがこのコードを通過させていると信じるのは本当に難しいと思います:

char result[4];  //declared to store the result
result = itoa(my_number);  // Output is unexpected.

1 つの理由で、アレイを再装着しようとしています。これは許可されるべきではありません。もう 1 つは、itoa()通常3 つの引数を取ります。プロトタイプは次のようになります。

char *itoa(int value, char * str, int base);

したがって、次のように呼び出す必要があります。

char result[4];
itoa(my_number, result, 10);

または、バッファ オーバーフローの可能性がない移植可能な関数を使用する場合は、次のようにします。

char result[4];
snprintf(result, 4, "%d", my_number);
于 2014-12-11T07:39:56.503 に答える
2

itoa標準 C ライブラリ関数ではありません。

使用できます

char result[sizeof(int) * CHAR_BIT / 10 * 3 + 4];  // '-1', '\0', max sizeof int on my 4 byte machine
// 10 bits are roughly equal to 3 digits at decimal base, extra 4 for '-', '\0', extra digit and safe character
sprintf(result, "%d", my_number);

それでも を使用したい場合はitoa、この関数のドキュメントを参照してください (ライブラリ/コンパイラ ドキュメント内)。

于 2014-12-11T07:45:25.353 に答える
1

my_number はインクリメントされるため、使用しているitoa()場合、my_number の新しい値である 124 が認識されます。

以下のコードを確認してください。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
   char char_array[4];
   char_array[0] = '1';
   char_array[1] = '2';
   char_array[2] = '3';
   char_array[3] = '\0';  //Terminating character

   int my_number = atoi(char_array);  
   printf("my_number = %d" , my_number);   // output is 123

   my_number++;    // works and my_number is incremented =124
   printf("now: my_number = %d" , my_number);   // output is 124


   char result[4];  //declared to store the result

   snprintf(result,4,"%d",my_number);
   printf("%c", result[0]);    
   printf("%c", result[1]);    
   printf("%c", result[2]);    
   return 0;
}
于 2014-12-11T07:46:48.207 に答える
0

最初に itoa(my_number) が間違っている可能性があります。次の関数しか知りません:

char *  itoa ( int value, char * str, int base );

str は、可能な値 (sizeof(int)*8+1) を含むのに十分な長さの配列である必要があります。つまり、radix=2 の場合、16 ビット プラットフォームでは 17 バイト、32 ビット プラットフォームでは 33 バイトです。

于 2014-12-11T08:13:22.363 に答える