2

整数として入力する防御的なプログラミングをしようとしましたが、文字を入力するとプログラムは無限ループに陥ります。次に、文字として入力するように切り替えましたが、ループが 2 回行われます。1 回は間違った文字で、もう 1 回は行末のキーストロークです。

一度だけループを取得する方法はありますか?

コード:

int main(int argc, char *argv[])
{
    char choice='5';
    while (choice != '1' && choice !='2' && choice !='3' && choice!='4' && choice!='0')
        {
             printf("Parakalw epilekste ena apo ta parakatw\n\n");
             printf("1.\tKafe 1.5 euro\n");
             printf("2.\tKafe me gala 1.8 euro\n");
             printf("3.\tSokolata 2.1euro\n");
             printf("4.\tSokolata me gala 2.4 euro\n");
             printf("0.\tExodos\n\n");
             printf("parakalw eisagete thn epilogh sas: ");
             scanf("%c",&choice);
        }
system("PAUSE");    
return 0;
}
4

2 に答える 2

2

防御的プログラミング (それが正確に何を意味するか) については、私はまったく使用scanfしません。間違いを犯しやすいからです。

代わりに、入力行を で読み取りfgets、必要に応じて解析してから、トリミング、カスタム解析コード、または場合によっては を使用しますsscanf。おそらく、何らかの検証の後です。

*scanfまた、常に関数の戻り値を確認することをお勧めします。実際のエラーと、実際にスキャンされた項目の数の両方を確認してください。

于 2013-03-05T19:54:46.460 に答える
2

空白をスキップするために使用scanf(" %c", &choice)します。そうしないと、文字を選択した後に改行が stdin に残され、次の scanf 呼び出しで読み取られます。指定子の前のスペースは、あらゆる種類の空白文字 (スペース、タブ、リターン) と一致することを意味します。

于 2013-03-05T19:24:09.017 に答える