gpt4 book ai didi

C 中的命令行参数 - 奇怪的输出

转载 作者:行者123 更新时间:2023-11-30 14:57:10 25 4
gpt4 key购买 nike

因此,我编写了一个简单的逆波兰计算器的代码,该计算器仅适用于使用命令行参数的正数。它将数字存储在堆栈中。插入和弹出的函数位于单独的源文件中。
我还编写了另一个程序,来检查我之前程序的控制流程。
这是第一个程序:

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
void push(double);
double pop(void);
int main(int argc, char *argv[])
{
int c;
double op2;
while(--argc>0 && (c=(*++argv)[0]))
if(isdigit(c))
push(atof(argv[0]));

else if(c=='+')
push(pop()+pop());

else if(c=='-')
{
op2=pop();
push(pop()-op2);
}

else if(c=='*')
push(pop() * pop());

else
{
op2=pop();
push(pop()/op2);
}

printf("\n%f\n", pop());
return 0;
}

运行该程序后,除“*”之外的所有运算符都起作用。例如,如果我的输入是“./pcalc 2 3 *”,那么这就是我得到的输出:
错误:堆栈为空错误:堆栈为空错误:堆栈为空错误:堆栈为空
-nan

如果我交换 while 循环中的条件,就像这样
while((c=(*++argv)[0]) && --argc>0)
然后我收到所有运算符(operator)的“段错误(核心转储)”消息。

为了了解我的程序的控制流程,我将部分代码更改为:

while(--argc>0 && (c=(*++argv)[0]))
if(isdigit(c))
printf("\nentry1\n");

else if(c=='+')
printf("\nentry2\n");

else if(c=='-')
printf("\nentry3\n");

else if(c=='*')
printf("\nentry4\n");

else
printf("\nentry5\n");

该程序的其余部分与第一个类似。将输入指定为“./pcalc 2 3 *”时,我得到以下输出:

entry1

entry1

entry5

entry5

entry5

entry5

entry5
error: stack empty
0.000000

这意味着控件不会转到星号的情况下,而是转到其他部分。
当我交换 while 循环的条件时,我得到的输出与上面类似(对于所有运算符,它显示控制流,对于“*”,它显示与上面相同的错误),除了它不不会显示任何运算符的堆栈空错误,而是显示段错误(核心转储)消息。

所以这就是我想问的:
1)我的第一个程序适用于除“*”之外的所有运算符。可能是什么原因?为什么控件转到else部分?

2)交换条件后,我访问了哪些我没有权限的内存?如果它是 NULL,那么不应该打破 while 循环并继续吗?

PS。这是我的第一个问题,所以如果我的写作风格有任何错误,或者问题太长,请告诉我!我们从错误中吸取教训:)
另外,我的编译器-GCC,操作系统-Ubuntu。

最佳答案

xx用户说的完全正确。
为了扩展它,&&运算符从左到右进行计算。如果左侧条件无效,则不会评估右侧条件,因为返回值已知为 0(假)。
运行./pcalc 2 3 *将扩展到./pcalc 2 3 <all the files/directories in current working directory>因此它永远不会将运算符推送到运算符堆栈上。

  • while(--argc>0 && (c=(*++argv)[0]))在提取第一个元素之前,将首先检查它是否仍在参数数组内。
  • while((c=(*++argv)[0]) && --argc>0)首先尝试提取一个值,然后检查它是否仍在数组的边界内。如果没有,那么它已经出现了段错误。

关于C 中的命令行参数 - 奇怪的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44097702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com