0
#include <stdio.h>

int main()
{
    int a;
    char msg[10];
    scanf("%d",&a);
    printf("%d\n",a);
    scanf("%[^\n]s",msg);
    printf("%s\n",msg);
    return 0;
}

プログラムは整数値を受け入れて出力していますが、2 番目のscanf()呼び出しは何も受け入れていません。どうしてこれなの?

コンテキスト内の scanf ステートメントに対する ^\n の影響。

4

3 に答える 3

2

コンソールが次のようになっている場合:

123
abc

次にstdin、内容があります:123\nabc\n

フォーマット文字列でscanf呼び出した後、次のようになります: . は消費されていないことに注意してください。"%d"stdin\nabc\n\n

指定子%[^\n](sそこにあるべきではありません。直後に消費する余分な文字として扱われます) は、 a までのすべての文字を読み取る\nことを意味します。そのため、文字列の先頭の の前に文字がないため、\n何も格納されません。バッファに入れられ、次のstdinように残ります: \nabc\n.


これを修正するには、最初のscanfフォーマット文字列をに変更し"%d\n"て、数値が読み取られた後に\nが消費されるようにします。%[^\n]も消費しないため、\nそのフォーマット文字列を に変更することもできます"%[^\n]\n"

于 2012-12-11T20:26:06.470 に答える
0

最初の scanf を次のように変更するだけです。

scanf("%d\n",&a);

それ以外の場合、2 番目の scanf は \n を参照して 0 項目を読み取ります (したがって、msg は変更されません。

元のコードといくつかの追加の診断を使用して:

#include <stdio.h>
#include <string.h>
int main() {
  int a;
  int itemsScanned;
  char msg[10]; strcpy (msg, "unchanged");
  itemsScanned=scanf("%d",&a);
  printf("itemsScanned=%d a=%d\n",itemsScanned, a);
  itemsScanned=scanf("%[^\n]s",msg);
  printf("itemsScanned=%d msg=%s\n",itemsScanned, msg);
  return 0;
}

出力 (3<\nl と入力した場合) は次のとおりです。

> ./a.out
3
itemsScanned=1 a=3
itemsScanned=0 msg=unchanged

最初の scanf に \n を追加し、5\nlHugo\nl と入力します。

./a.out
5
Hugo
itemsScanned=1 a=5
itemsScanned=1 msg=Hugo
于 2012-12-11T20:13:39.613 に答える
0
scanf("%[^\n]s", msg);

これはおそらくあなたが望むものではありません.スキャンセットのs後には必要ありません. scanfこれを行うと、文字を探すように指示されますs

于 2012-12-11T20:18:13.947 に答える