【发布时间】:2012-05-27 03:20:23
【问题描述】:
好的。让我重新开始。我正在尝试编写一个程序来评估它的反向波兰符号参数。 (即 ./program 2 4 +,计算结果为 6)。
int main(int argc, char *argv[])
{
char oper[MAXOP];
char *ptr;
unsigned char c;
double op2;
while (--argc > 0 && ++argv != NULL) {
ptr = oper;
if (isdigit(c = **argv))
{
while (isdigit(c = **argv++))
{
*ptr++ = c;
}
*ptr = '\0';
push(atof(oper));
}
else if (isalpha(c))
{
while (isalpha(c = **argv++))
{
*ptr++ = c;
}
...
...
}
}
程序应该检查每个参数的第一个字符是字母还是数字或运算符,但结果总是字母。
+++++++++更新+++++++++++++
嗯,这很奇怪。它现在正在工作。条件之前,
isdigit(c = **argv) 没有对数字参数评估为真(如果其余代码错误则无关紧要)。现在可以了,但是条件isdigit(c = **argv++)是错误的。
应该是isdigit(c = *argv[0]++)。
我有两个同名文件。它们位于不同的目录中,但包含相同的代码。在使用这个文件时,我必须在另一个目录中编译另一个文件,因此尽管对这个文件进行了编辑,但得到了相同的输出。我的错。
【问题讨论】:
-
这段代码简直刺痛了我的眼睛。将所有不愉快的副作用移出条件并再次询问。但是你的问题是什么?
-
真的,没人应该写那样的代码。
-
我不认为
**argv++做你认为它做的事情(这就是你应该使用更简单的操作的原因之一)。 -
除了建议您查看
**argv++操作,因为它们几乎肯定是错误的,任何人都很难帮助您找出代码有什么问题,因为您不知道不要告诉我们它应该做什么。 -
不要试图在一行中做这么多。像
isalpha(c = **argv++)这样的东西应该被分成几行,每个人都做一件事(提前argv,得到字符,检查它是否是一个字母)。然后你可以调试(使用调试器或只是printf)看看哪一步出错了。
标签: c command-line-arguments argv