コンソールから文字配列を取得したかったのですが、空白も含まれています。Cで知っている唯一の方法はscanfですが、空白にヒットすると入力の取得を停止できません。どうすればいいですか?
これが私がやっていることです。
char address[100];
scanf("%s", address);
コンソールから文字配列を取得したかったのですが、空白も含まれています。Cで知っている唯一の方法はscanfですが、空白にヒットすると入力の取得を停止できません。どうすればいいですか?
これが私がやっていることです。
char address[100];
scanf("%s", address);
fgets() を使用してみてください。選択したストリームから完全な行を読み取ります(stdin、探していると思います)。あなたの場合の例:
char address[100];
fgets(address, 100, stdin);
fgets() は、最大でも 2 番目の引数で渡された文字数 (マイナス 1) を読み取ります。バッファオーバーフローはなく、改行文字 (または EOF まで) までの行全体を取得できます。読み取る最大文字数はパラメーターの 1 つであるため、行の一部が表示される可能性があることに注意してください。返された文字列の最後の文字が '\n' であるかどうかを確認すると、完全な行を取得したことがわかります。EOF の検出も非常に簡単です。NULL
戻り値とチェックがerrno
役に立ちます。
部分的な行については、Chris (以下) に感謝します。
次のようなことを試すことができます:
char str[100];
scanf("%99[0-9a-zA-Z ]s", str);
printf("%s\n", str);
でそれを行う方法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.
}
見るfgets()
fgets()
stream から最大で size 未満の 1 文字を読み取り、s が指すバッファーに格納します。EOF または改行の後、読み取りは停止します。改行が読み取られると、バッファに格納されます。'\0' は、バッファー内の最後の文字の後に格納されます。
char *fgets(char *s, int size, FILE *stream);
input-string-through-scanfなど、多くの SO の質問で詳細を確認できます。
(人気のため、への参照gets()
は削除されました)
個人的には fgets を使用しますが、それはすでにここで指摘されています。scanf を使用してそれを行う 1 つの方法は、次のようになります。
scanf("%[^\n]", address);
これは、「\n」が見つかるまですべての文字を取り込みます。
私のスタイル。
#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);