C 为什么代码会执行两次?
我正在尝试为反向波兰符号计算器编写代码。为什么当我输入一个数字时,下面的代码会执行两次C 为什么代码会执行两次?,c,C,我正在尝试为反向波兰符号计算器编写代码。为什么当我输入一个数字时,下面的代码会执行两次 int a[50]; int topOfStack = -1; char c; while((c = getchar()) != EOF) { int n = atoi(&c); topOfStack += 1; a[topOfStack] = n; printf("top of stack is %d\n", a[topOfStack]); printf("i
int a[50];
int topOfStack = -1;
char c;
while((c = getchar()) != EOF)
{
int n = atoi(&c);
topOfStack += 1;
a[topOfStack] = n;
printf("top of stack is %d\n", a[topOfStack]);
printf("index top of stack is %d\n", topOfStack);
}
return 0;
}这个
int n = atoi(&c);
是未定义的行为
atoi()
函数使用一个指向字符串的char*
指针,也就是一个非nul
字节序列,后跟一个nul
字节
将指针传递给单个字符,然后atoi()
递增指针,尝试查找终止的'\0'
,但取消引用递增指针是未定义的行为,因为指针不指向数组
当代码中存在未定义的行为时,您观察到的其他行为并不重要,因为它很可能是由未定义的行为问题引起的
要将单个char
转换为int
,只需从数字的ascii值中减去0
,如下所示
int n = c - '0';
但这并不能保证n
是您期望的值,因为在尝试使用c
之前,您需要检查isdigit(c)
,就像它是一个数字一样
另外:c
的类型是错误的,它应该是int
,因为getchar()
返回int
,您不希望值被截断。您的代码中没有else
。为什么您认为一次处理一个字符是个好主意?@iharob对不起。我编辑了我的代码和问题。是printf语句和操作执行了两次。@IgnacioVazquez Abrams为什么不呢?您打算如何处理由多个字符组成的数字?