2

したがって、scanf関数を使用してユーザーから初期コマンドを取得する必要があるプログラムがあります。問題は、1つの文字列コマンド、1つの文字列コマンドと文字列引数、1つの文字列コマンドとint引数、または1つの文字列だけである可能性があることですコマンドと 2 つの int 引数

どれが最初に選択されるかわからないため、これらすべてを処理できる 1 つの scanf 関数を何らかの方法で作成する必要があります。

したがって、すべてのエッジケースを処理するために作成したコードは

scanf("%s", c);
scanf("%s%s", c, s;
scanf("%s%d", c, &i);
scanf("%s%d%d", c, &i, &i2);

およびエンド ユーザーが入力できる可能性のあるコマンドの例

 print
 insert Hello
 del 4 
 pick 2 5

しかし、これはうまくいきません

条件付きで実行される scanf 関数を作成する方法はありますか?

4

4 に答える 4

2

関数の scanf ファミリは、正常に解析されたフィールドの数を返すため、gets を使用して完全な文字列を取得し、sscanf を使用して長いパターンを前に配置します。

char buffer[,..], cmd[...];
int num1, num2;

gets(buffer);
if (sscanf(buffer, "%[^ ] %d %d", cmd, &num1, &num2) == 3) {
...
}
else if (sscanf(buffer, "%[^ ] %d", cmd, &num1) == 2) {
...
} else {
...
}

パターン%[^ ]は、最初の空白を除いた文字列を取得します。また、パターンをスペースで区切ると、scanf はその間の空白をスキップします...

于 2013-10-10T15:53:38.887 に答える