我正在尝试为反向抛光表示法计算器编写代码。为什么当我输入数字时,以下代码会被执行两次?
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;
}
答案 0 :(得分:3)
此
join
是未定义的行为。
int n = atoi(&c);
函数将atoi()
指针指向一个字符串,AKA是一个非char *
字节序列,后跟一个nul
字节。
您正在将指针传递给单个nul
,然后char
递增指针尝试查找终止atoi()
但是取消引用递增的指针是未定义的行为,因为指针未指向到阵列。
当您的代码中存在未定义的行为时,您观察到的其他行为并不重要,因为它很可能是由未定义的行为问题引起的。
要将单个'\0'
转换为char
,您只需要从数字的ascii值中减去int
的ascii值,就像这样
0
但这并不能保证int n = c - '0';
是您期望的价值,因为在尝试使用n
之前需要先与isdigit(c)
核对,就像它是一个数字一样
另外:c
的类型错误,应该是c
,因为int
会返回getchar()
,并且您不希望该值被截断。