2

これが非常に基本的な質問のように聞こえる場合は申し訳ありませんが、ここに来るのは初めてです!

Cのコーディング、特にスイッチとそのスイッチのデフォルトで問題が発生しています。次にいくつかのサンプルコードを示します。

#include<stdio.h>

int key;
main()
{
while((key=getchar())!=EOF)
{
printf("you pressed %c \n",key);
    switch(key){
case'0':
case'1':
case'2':
case'3':
   printf("it's a numeral\n");
   break;
default:
   printf("it's not a numeral\n");
  } 
 }
}

実際のコードはかなり長く、これは単なる例です。

したがって、コードはそれをコンパイルして実行しますが、次のようになります。

「あなたは1を押しました、それは数字です、あなたは押しました、それは数字ではありません。」

私のコードは「失敗」し、どちらも参照せずに繰り返されるようです。これは教科書の例であり、私は完全に立ち往生しているので、誰かが助けることができればそれは素晴らしいことです!

よろしくお願いします。

4

5 に答える 5

1

を押すと読み取りバッファーに入れられる改行文字を食べる必要がありますreturn

getchar問題を解決するために、切り替え後または切り替え前に別の呼び出しを発行します。

于 2012-05-20T22:03:12.670 に答える
1

*nixシステムで「\n」を生成するEnterキーの入力を考慮する必要があります。WindowsシステムでEnterキーを押すとどうなるかわかりません。

これが、リターンキーを食べるために修正された元のコードです。

#include<stdio.h>

int key = 0;
main()
{
    while((key=getchar())!=EOF)
    {
        if('\n' == key)
        {
            /* Be silent on linefeeds */
            continue;
        }

        printf("you pressed %c \n",key);
            switch(key){
        case'0':
        case'1':
        case'2':
        case'3':
           printf("it's a numeral\n");
           break;

        default:
           printf("it's not a numeral\n");
      } 
     }
}

あなたgetchar()は特定の理由で使用しているかもしれませんが、Cでの私の経験は通常、行全体を読むことを含み、RTL関数scanfはあなたのために行ターミネーターを食べます。

于 2012-05-20T22:16:54.680 に答える
0

ここにアイデアがあります...直前に、printf()スペースとすべての制御文字を無視するロジックを挿入します...

if(key <= ' ')
  continue;
printf(...) ...
于 2012-05-20T22:03:47.873 に答える
-1

それが問題かどうかはわかりませんが、休憩なしで3つのケースがあります。したがって、キー「1」を押すと、プログラムには何の関係もないので、次のケースに進みます。これがデフォルトです。あなたはint変数でcharを取りますが???

あなたの例では、次のようなif句を使用する方が良い方法です。

#include<stdio.h>

char key;
main()
{
while((key=getchar())!=EOF)
{
printf("you pressed %c \n",key);
   if(key == '0' || key == '1' || key == '2' || key == '3'){
      printf("it's a numeral\n");
   }
   else {
      printf("it's not a numeral\n");
   }
}

コードはテストされていません。;-)

より大きなプログラムでの最良の方法は、正規表現を使用することです。

この回答がお役に立てば幸いです。

于 2012-05-20T22:16:29.787 に答える
-1
  • 問題は、入力バッファがフラッシュされていないことが原因である可能性があります。スイッチケースで「1」が一致すると、改行文字がバッファに残ります。
  • これを試して、
     fflush(stdin)
于 2012-05-20T22:27:19.530 に答える