8

コンソールから文字配列を取得したかったのですが、空白も含まれています。Cで知っている唯一の方法はscanfですが、空白にヒットすると入力の取得を停止できません。どうすればいいですか?

これが私がやっていることです。

char address[100];

scanf("%s", address);
4

7 に答える 7

14

fgets() を使用してみてください。選択したストリームから完全な行を読み取ります(stdin、探していると思います)。あなたの場合の例:

char address[100];

fgets(address, 100, stdin);

fgets() は、最大でも 2 番目の引数で渡された文字数 (マイナス 1) を読み取ります。バッファオーバーフローはなく、改行文字 (または EOF まで) までの行全体を取得できます。読み取る最大文字数はパラメーターの 1 つであるため、行の一部が表示される可能性があることに注意してください。返された文字列の最後の文字が '\n' であるかどうかを確認すると、完全な行を取得したことがわかります。EOF の検出も非常に簡単です。NULL戻り値とチェックがerrno役に立ちます。

部分的な行については、Chris (以下) に感謝します。

于 2009-10-12T17:02:30.040 に答える
7

次のようなことを試すことができます:

char str[100];
scanf("%99[0-9a-zA-Z ]s", str);
printf("%s\n", str);
于 2009-10-12T17:06:53.493 に答える
1

でそれを行う方法scanf()はありますが、私の謙虚な意見では、それらはすぐに醜くなります。一般的なパターン (驚くべきことにまだ言及されていません) は、文字列を で読み取り、fgets()を使用sscanf()して処理することです。sscanf()のようscanf()に動作しますが、標準入力ストリームを処理する代わりに、それに渡された文字列を処理します (同じ方法printf()sprintf()関連付けられています)。基礎:

char s[100], str[100];
int i, x;
fgets(s, 100, stdin);
if(sscanf(s, "%d %x %s", &i, &x, str) != 3)
  {
    // our three variables weren't all set - probably an invalid string
    // either handle the error or set default values here.
  }
于 2009-10-12T17:30:13.680 に答える
0

見るfgets()

fgets()stream から最大で size 未満の 1 文字を読み取り、s が指すバッファーに格納します。EOF または改行の後、読み取りは停止します。改行が読み取られると、バッファに格納されます。'\0' は、バッファー内の最後の文字の後に格納されます。

char *fgets(char *s, int size, FILE *stream);

input-string-through-scanfなど、多くの SO の質問で詳細を確認できます。

(人気のため、への参照gets()は削除されました)

于 2009-10-12T17:06:23.183 に答える
0

個人的には fgets を使用しますが、それはすでにここで指摘されています。scanf を使用してそれを行う 1 つの方法は、次のようになります。

scanf("%[^\n]", address);

これは、「\n」が見つかるまですべての文字を取り込みます。

于 2009-10-12T18:25:23.960 に答える
0

私のスタイル。

 #include <stdio.h>

    #define charIsimUzunlugu 30

        struct personelTanim
        {       
            char adSoyad[charIsimUzunlugu];             
        } personel;

    printf(" your char       : ");
    scanf("%[^\n]",personel.adSoyad);

    printf("\n\n%s",personel.adSoyad);
于 2014-02-18T11:29:43.433 に答える