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

atoi需要 ASCII 字符,所以如果数组是,比如说last[0] = 1and last[1] = 2,它将找不到任何字符,如果是 last[0] = '1'并且last[1] = '2'它会打印12

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

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

(假设num1num2介于 0-9 之间)

简短的编辑来解释这个想法:

'0'数字(0x30) 到'9'(0x39)的 ascii 值是连续的,因此添加0'0'(0x30) 将得到'0'(0x30),添加2'0'(0x30) 将得到'2'(0x32)

于 2012-05-29T04:10:47.267 回答
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 回答
0

我认为这是因为您正在尝试打印出数组。你想打印出一个值吗?还是使用 for 循环的所有值?

于 2012-05-29T04:11:27.320 回答
0

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

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

于 2012-05-29T04:11:45.007 回答
0

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

将数字分配给 char 与将该字符串作为 ASCII 十进制数字的可读表示不同。为此,请尝试sprintf().

于 2012-05-29T04:12:15.637 回答