web-dev-qa-db-ja.com

scanf()を使用して改行が見つかるまで入力から読み取る方法は?

入力が空になるまで入力から読み取り、ユーザーがEnterキーを押すまで、Cで作業するように求められました。これを行う場合:

scanf("%2000s %2000s", a, b);

1番目のルールに従いますが、2番目のルールには従いません。
書く場合:

私は頭が良いです

私が得るものは次と同等です:
a = "I";
b = "am";
ただし、次のようになります。
a = "I";
b = "am smart";

私はすでに試しました:

scanf("%2000s %2000[^\n]\n", a, b);

そして

scanf("%2000s %2000[^\0]\0", a, b);

1つ目は、ユーザーが押すのを待ちます Ctrl+D (EOFを送信するため)、それは私が望むものではありません。 2番目では、コンパイルされません。コンパイラによると:

警告:「%[」形式の終了「]」はありません

これを解決する良い方法はありますか?

17
brunoais

scanf(およびいとこ)には少し奇妙な特徴があります。フォーマット文字列(スキャンセットの外側)の空白は、入力の空白の任意の量と一致します。少なくともデフォルトの "C"ロケールでは、改行は空白として分類されます。

これは、末尾の'\n'は、a改行だけでなく、後続の空白も一致させようとしています。入力の終了を通知するか、空白以外の文字を入力するまで、一致とはみなされません。

これに対処するには、通常、次のようなことを行います。

scanf("%2000s %2000[^\n]%c", a, b, c);

if (c=='\n')
    // we read the whole line
else
    // the rest of the line was more than 2000 characters long. `c` contains a 
    // character from the input, and there's potentially more after that as well.
36
Jerry Coffin
scanf("%2000s %2000[^\n]", a, b);
7
VHaravy

次のようなgetcharとwhileを使用します

while(x = getchar())
{   
    if(x == '\n'||x == '\0')
       do what you need when space or return is detected
    else
        mystring.append(x)
}

擬似コードを書いたのに申し訳ありませんが、しばらくの間C言語を使用できません。

4
darkito.net
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int main(void)
{
  int i = 0;
  char *a = (char *) malloc(sizeof(char) * 1024);
  while (1) {
    scanf("%c", &a[i]);
    if (a[i] == '\n') {
      break;
    }
    else {
      i++;
    }
  }
  a[i] = '\0';
  i = 0;
  printf("\n");
  while (a[i] != '\0') {
    printf("%c", a[i]);
    i++;
  }
  free(a);
  getch();
  return 0;
}
3

遅すぎますが、このアプローチを試すこともできます。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int i=0, j=0, arr[100];
    char temp;
    while(scanf("%d%c", &arr[i], &temp)){
        i++;
        if(temp=='\n'){
            break;
        }
    }
    for(j=0; j<i; j++) {
        printf("%d ", arr[j]);
    }

    return 0;
}
2
sameera sy

宿題の問題のようですね。 scanf()は、問題に使用する間違った関数です。 getchar()またはgetch()をお勧めします。

注:これは宿題のように見えるので、意図的に問題を解決するのではなく、単に正しい方向に向けるだけです。

0
bsegraves