0

int、char、string、および別の int をスキャンしようとしています。次のコードを使用して、それらすべてをスキャンできると思いました。

int int1, int 2;
char char1;
char* string1;
fscanf(stdin, "%d %c %s %d", &int1, &char1, string1, &int2)

しかし、コードを実行すると、すべての情報を入力する前に突然停止します。変数を改行で区切る予定です。実行時の端末は次のようになります。

~$ ./program
100
K
word
~$

int2 を入力する前にプログラムが終了するため、string1 も考慮されていない可能性があると思います。これを修正する方法、またはより効率的に機能する代替方法に関する提案はありますか?

4

2 に答える 2

0

変数を正しく宣言(または割り当て)した場合、指定した行は期待どおりに機能します。

このコードでは:

    int int1, int2;
    char char1;
    char *string1;

    fscanf(stdin, "%d %c %s %d", &int1, &char1, string1, &int2);

ここでは初期化されていないため、これstring1は未定義の動作です。Linux / glibcでは、(NULL)string1が含まれていると、フォーマット文字列の処理が停止します。これにより、指定したのと同じ結果が得られます。他のシステムでは動作する可能性があり、クラッシュする可能性があります。0scanf

これは期待どおりに機能します。

    int int1, int2;
    char char1;
    char string1[20];

    fscanf(stdin, "%d %c %19s %d", &int1, &char1, string1, &int2);
于 2013-03-19T20:20:36.833 に答える
0
fscanf(stdin, "%d\n %c\n %s\n %d\n", &int1, &char1, string1, &int2)

\n - プラットフォームによって異なりますが、\n の代わりに \n\carriege return
を使用する必要があるものもあります.
あなたが言ったように、それぞれ新しい行にトークンを配置したくないので、パラメーター文字列に新しい行のシンボルを配置します

于 2013-03-19T20:26:50.377 に答える