我有一个问题,我的C程序只为小于5的值正确分配输入数据。我在创建保存值的int数组时发现错误:我使用了atoi(var-1)而不是atoi( VAR)-1。
当var ='5'时,atoi(var-1)在打印时为0。为什么错误的char转换为int转换的数字为“5”?那为什么它在那时变为零?
我只是对这实际发生的事情感到好奇。
答案 0 :(得分:3)
当你写atoi(var - 1)
时,var
是char*
,你要求函数atoi
读取从低于{1的内存位置开始的字符串{1}}并将其转换为整数。
通常,位于较低内存地址的字符可以是任何内容。当你的var
为char*
时,你恰好让它破裂了,但它可能发生在任何地方。
另一方面,'5'
完全符合您的预期,将atoi(var) - 1
转换为var
,然后以数字方式减去1。
答案 1 :(得分:2)
指针算术。如果var
是字符串(char *
),则var + n
是从偏移n
开始的子字符串。
const char* s = "12345":
printf("%d\n", atoi(s + 2)); // prints 345
也允许减法:var - 1
是指向字符串之前的一个字符的指针。这可能是任何内容,但可能是非数字字符,因此atoi
返回0。