2017-01-05 12 views
-1

標準入力から数字や特殊文字を読み込むプログラムに問題があり、読み込んだ内容に応じて特定の関数を実行しています。入力が数字の場合はスタックに置く必要があり、特殊文字の場合は数学関数の1つをトリガする必要があります。しかし、どの入力機能やトリックを使用すべきかはわかりません。私は、文字を読むためのscanfを使用している場合、私は(ポインタを必要とする)(税引後営業利益)数としてスタックにそれを置くことに問題があるswitch()関数の整数と特殊文字の区別

scanf("%c", a); 
switch(a) { 
    case'+': 
    add(stack); 
    break; 
    case '-': 
    sub(stack); 
    break; 
    case 'number': 
    push(stack, a); 
    break; 
    ...} 

しかしスイッチ()関数を作成し、私は、整数のためのscanfあれば文字と比較することはできません。この仕事をする他の方法はありますか?私は複数のscanfを試してみましたが、それでも数字と特殊文字の区別に問題があり、文字がスタックに置かれてしまいました。

+3

問題の数字は1桁か複数桁ですか? – dbush

+0

両方。私はそれを1桁の数字と大きい数字の両方で動作させようとしています。 – MrHowever

+1

@dbush: 'char'に複数の数字を合わせるには? –

答えて

0

電卓が1桁の数字を処理できることは間違いありませんか?しかしあなたの質問に。この場合、数字の文字をテストし、スタックにプッシュするにはisdigitを使用します。それ以外の場合は大きなスイッチを使用してください。

編集:入力を読み取る以外は、複数桁の数字の検出も簡単です。 GNUシステムをターゲットにしているなら、必要なメモリを割り当てる "%ms"フラグを使うことができます。

bool isdigita (const char* s) 
{ 
    char c = *s; 
    while (c != '\0') { 
     if (!isdigit (c)) 
      return false; 
     c = *s++; 
    } 
    return true; 
} 

void test_isdigita() 
{ 
    assert (isdigita ("42")); 
    assert (!isdigita (" 42")); 
    assert (!isdigita ("42!!")); 
    assert (!isdigita ("4!!1")); 
} 
+1

'char a;をコンパイルしてみてください。 sscanf( "%c"、a); '。 2行で少なくとも2つの問題。 'char a; ... int num = atoi(&a); 'も問題です。'&a'は変換される_string_を指しません。 – chux

+0

私は多桁数の解を探しています – MrHowever

0

あなたはcaseフォールスルー機能を利用することができます。 scanf

scanf("%c", &a); 
switch(a) { 
    case'+': 
    add(stack); 
    break; 
    case '-': 
    sub(stack); 
    break; 
    case '0': 
    case '1': 
    case '2': 
    case '3': 
    case '4': 
    case '5': 
    case '6': 
    case '7': 
    case '8': 
    case '9': 
    push(stack, a); 
    break; 
    ...} 
1

%c書式指定子は、一度に単一の文字を読み込みます。だから、複数の数字を持つ数字を読むのに使うことはできません。少なくとも最後に読んだ文字を追跡せずに、最後に読んだ数字に押すことはできません。

各トークンを空白で区切らなければならないと仮定すると、%s書式指定子を使用して文字列を読み取る方がよいでしょう。次に、文字列の最初の文字を調べて、それがどのような種類のトークンであるかを調べます。

数字があるかどうかを確認するためにフォールスルーケースを利用することができます。

char token[20] = ""; 
scanf("%s", token); 
switch (token[0]) { 
    case'+': 
    add(stack); 
    break; 
    case '-': 
    sub(stack); 
    break; 
    case '0': 
    case '1': 
    case '2': 
    case '3': 
    case '4': 
    case '5': 
    case '6': 
    case '7': 
    case '8': 
    case '9': 
    push(stack, atoi(token)); 
    break; 
    ... 
0

最初の文字(先頭の空白をスキップする可能性があります)を読み取って、それに基づいて判断することができます。それが数字の場合は、残りの数字を読み進めます。そうでなければ、それを受け入れ可能な特殊文字と照合します。たとえば、

int ch; 

// ... 

ch = getch(); 
switch (ch) { 
    case -1: 
     // handle error/EOF ... 
     break; 
    case '0': 
    case '1': 
    case '2': 
    case '3': 
    case '4': 
    case '5': 
    case '6': 
    case '7': 
    case '8': 
    case '9': 
     // read the rest of the digits of the number, if any ... 
     // push the assembled number ... 
     break; 
    case '+': 
     // ... 
     break; 
    // ... more cases ... 
    case ' ': 
     // do nothing 
     break; 
    default: 
     // handle invalid input ... 
     break; 
} 

他の方法もあります。

関連する問題