ctype.h isdigit没有在argv上工作

时间:2012-05-20 07:02:30

标签: c command-line-arguments argv

确定。让我重新开始吧。我正在尝试编写一个程序来评估反向波兰表示法参数。 (即./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;
        }
                   ...
         ...
    }
}

程序应该检查每个参数的第一个字符,如果它是alpha或数字或运算符,但它总是变成alpha。

+++++++++++++++++++++++++++++++++++++++++++++

嗯,这很奇怪。它现在正在运作。在此之前, 对于数字参数,isdigit(c = **argv)没有评估为true(如果其余代码错误则无关紧要)。现在确实如此,但条件isdigit(c = **argv++)是错误的。

应为isdigit(c = *argv[0]++)

我有两个同名的文件。它们位于不同的目录中,但包含相同的代码。使用这个时,我必须已经在另一个目录中并编译其他文件,因此尽管编辑了这个文件,但仍然获得相同的输出。我的坏。

2 个答案:

答案 0 :(得分:3)

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

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

char *cur_arg = *argv;

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

答案 1 :(得分: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;
}