我对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
,我该如何解决?
答案 0 :(得分:7)
atoi
需要ASCII字符,所以如果数组是last[0] = 1
和last[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));
...