【问题标题】:ctype.h isdigit not working on argvctype.h isdigit 不适用于 argv
【发布时间】: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


【解决方案1】:
#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;
}

【讨论】:

    【解决方案2】:

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

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

    char *cur_arg = *argv;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 2022-12-19
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多