-2

好的。让我重新开始。我正在尝试编写一个程序来评估它的反向波兰符号参数。(即 ./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]++)

我有两个同名文件。它们位于不同的目录中,但包含相同的代码。在使用这个文件时,我必须在另一个目录中编译另一个文件,因此尽管对这个文件进行了编辑,但得到了相同的输出。我的错。

4

2 回答 2

3

您是否尝试过使用调试器并弄清楚会发生什么?

我的第一个猜测是这**argv++是错误的(你是在增加 argv 吗?*argv?**argv?即使它没有错,它只是令人困惑的代码)。切换到:

char *cur_arg = *argv;

并检查 cur_arg (使用 cur_arg++ 来获取下一个字符,而不是 c=*cur_arg++ - 再次,令人困惑的代码)。

于 2012-05-20T07:09:41.633 回答
0
#include <stdio.h>
#include <ctype.h>

#define MAXOP 16

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';
            printf("DEBUG:%s\n", oper);
        } else if(ispunct(c)){//isalpha is alphabet check , '+' does not fit.
            while(ispunct(c = *(*argv)++)){
                *ptr++ = c;
            }
            *ptr = '\0';
            printf("DEBUG:%s\n", oper);
        }
    }
    return 0;
}
于 2012-05-20T12:02:07.123 回答