-2

Ok。もう一度始めましょう。逆ポーランド記法の引数を評価するプログラムを作成しようとしています。(つまり、./ 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;
        }
                   ...
         ...
    }
}

プログラムは、各引数の最初の文字がアルファ、数字、または演算子であるかどうかをチェックする必要がありますが、常にアルファであることがわかります。

+++++++++ UPDATE +++++++++++++

まあ、それは奇妙です。現在動作しています。条件の前は、 isdigit(c = **argv)数値引数についてtrueと評価されていませんでした(コードの残りの部分が間違っていても問題ありませんでした)。今はそうですが、条件isdigit(c = **argv++)が間違っています。

する必要がありますisdigit(c = *argv[0]++)

同じ名前のファイルが2つありました。それらは異なるディレクトリにありましたが、同じコードが含まれています。これを操作している間、私は他のディレクトリにいて、他のファイルをコンパイルしている必要があります。したがって、これを編集しても同じ出力が得られます。私の悪い。

4

2 に答える 2

3

デバッガーを使用して、何が起こるかを理解してみましたか?

私の最初の推測はそれ**argv++が間違っているということです(あなたはargvを増やしていますか?* argv?** argv?それが間違っていなくても、それは単に紛らわしいコードです)。切り替える:

char *cur_arg = *argv;

そして、cur_argを調べます(c = * cur_arg ++ではなく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 に答える