Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么代码会执行两次?_C - Fatal编程技术网

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为什么不呢?您打算如何处理由多个字符组成的数字?