在这种情况下,atoi究竟发生了什么?

时间:2012-05-29 04:07:30

标签: c++ c atoi

我对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,我该如何解决?

5 个答案:

答案 0 :(得分:7)

atoi需要ASCII字符,所以如果数组是last[0] = 1last[1] = 2,那么它将找不到任何字符,如果它是last[0] = '1'和{{1}而不是打印last[1] = '2'

在这种特殊情况下,您可以通过以下方式实现:

12

(假设last[0]='0' + num1; last[1]='0' + num2; num1介于0-9之间)

简短编辑以解释这个想法:

数字num2(0x30)到'0'(0x39)的ascii值是连续的,因此将'9'添加到0(0x30)将为您提供{{ 1}}(0x30)并将'0'添加到'0'(0x30)将为您提供2(0x32)

答案 1 :(得分:0)

我认为这是因为您正在尝试打印出阵列。您想要打印出单个值吗?或者使用for循环的所有值?

答案 2 :(得分:0)

last[0]=(char)num1;只是将数字转换为字符,但其值保持不变(并在您的情况下截断,因为num1长度为16位)。

因此,在使用char*之前,您没有将数字转换为atoi表示,您只是在不同类型上输入数字(不涉及ASCII编码)。

答案 3 :(得分:0)

atoi()适用于以null结尾的ascii字符串,而不是数字。 您可能只想要printf("%d%d\n", num1, num2);

为char指定一个数字与使该字符串成为ASCII十进制数字的可读表示形式不同。为此,请尝试sprintf()

答案 4 :(得分: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));
...