我正在尝试为逆波兰符号计算器编写代码。为什么当我输入一个数字时,以下代码会执行两次?
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
字节。
您将指针传递给单个 char
,然后 atoi()
递增该指针,尝试查找终止 '\0'
但取消引用递增的指针是未定义的行为,因为指针不指向数组。
当代码中存在未定义行为时,您观察到的其他行为并不重要,因为它很可能是由未定义行为问题引起的。
要将单个char
转换为int
,您只需从数字的ascii值中减去0
的ascii值,如下所示
int n = c - '0';
但这并不能保证 n
是您期望的值,因为您需要在尝试使用 c 之前检查
就好像它是一个数字。isdigit(c)
另外:c
的类型是错误的,它应该是int
,因为getchar()
返回int
并且您不希望该值被截断。
关于c - 为什么代码执行了两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34955900/