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("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/

相关文章:

c - 这个#define 相当于C 中的这个变量定义吗?

c - 在 C 中使用 fwrite 的错误 int 值

c - NASM 汇编数理逻辑

c - 试图了解gcc选项-fomit-frame-pointer

c - 在 C 中实现简单的高通和低通滤波器

c - 旗帜如何发挥作用?

c - C 枚举的大型 c2hs 推断大小

java - while循环不读取最后一项

可以使用 stdin 和 stdout 作为 tcp 套接字执行 bash

c - 如何解决这个指针问题?