【问题标题】:Converting a [char] variable to [int] then back to [char]将 [char] 变量转换为 [int] 然后再转换回 [char]
【发布时间】:2014-12-11 07:33:46
【问题描述】:

我正在使用 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,而是在最高有效位上进行加法。

【问题讨论】:

  • 你有一个大小为 3 的数组,你假装它的大小为 4。
  • -1 不是真正的代码。例如itoa 的参数数量错误,尝试重新安装数组。

标签: c++ c arrays atoi itoa


【解决方案1】:

我发现真的很难相信你的编译器会让这段代码通过:

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

出于一个原因,您正在尝试重新安装阵列。这是不应该被允许的。另一方面,itoa() 通常采用 三个 参数。它的原型应该是这样的:

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);

【讨论】:

  • ...或使用标准函数snprintf(result, 4, "%d", my_number)。
  • @user694733:这绝对值得包含在答案中。谢谢!
【解决方案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,请查阅该函数的文档(在库/编译器文档中)

【讨论】:

  • 您的意思是 snprintf 而不是 sprintf 吗?
  • 不,我的意思是sprintf。当缓冲区大小有限时,您可以使用 snprintf。
【解决方案3】:

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;
}

【讨论】:

    【解决方案4】:

    首先 itoa(my_number) 可能是错的,我只知道后面的函数:

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

    str 应该是一个足够长的数组以包含任何可能的值: (sizeof(int)*8+1) for radix=2 即 16 位平台中的 17 个字节和 32 位平台中的 33 个。

    【讨论】:

      猜你喜欢
      • 2020-12-18
      • 2015-12-19
      • 2018-09-18
      • 1970-01-01
      • 2014-05-14
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多