为什么代码会被执行两次?

时间:2016-01-22 21:02:28

标签: 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("index top of stack is %d\n", topOfStack);   
}


return 0;

}

1 个答案:

答案 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(),并且您不希望该值被截断。