0

以下のプログラムの何が問題になっていますか(ここで何が起こっているのですか)?ユーザーが空の文字列を挿入した後(Enterキーのみを押す)、forループを中断する必要がありますが、私の場合は、無限のforループで終了します。コメントにあるものを試しましたが、成功しませんでした。

#include <stdio.h>
#include <string.h>                                      

struct S {
  char str [10];
};

int main(void)
{
  int n;
  struct S strings [10];
  for (n = 0; n < 10; n++) {
    # fflush(stdout);
    scanf("%s", strings[n].str);
    if (strlen(strings[n].str) == 0)
      break;
    # getchar();
  }
  printf("done");
  return 0;
}

交換scanfするとgets(strings[n].str); doneは印刷されません。どのように修正しますか?

このサンプルソリューションは機能します。私のコードと比較して違いはありますか?

4

4 に答える 4

5

Enter キーは空の文字列ではなく、ASCII 文字または CR と LF (Windows の場合) の 2 文字です。

于 2012-05-29T10:20:01.357 に答える
2

入力が空かどうかを調べるために strlen を使用しないでください。他の人が言ったように、ENTER を押すと、1 つか 2 つの文字が送られてきます。

代わりに、文字列の最初の文字をチェックして、それが'\n'または'\r'

于 2012-05-29T10:34:30.967 に答える
1

scanf入力したものを正確に返します...つまり、私が想像するcrlfペアです!

于 2012-05-29T10:20:49.063 に答える
1

使用の問題scanfは、空の文字列ではなく、何かを期待していることです。fgetsの代わりにeg を使用してこれを解決しますscanf

if (fgets(strings[n].str, sizeof(strings[n].str), stdin))
{
    /* You got a string, it will contain the newline! */
}
于 2012-05-29T10:26:27.930 に答える