2016-12-02 7 views
1
void loginForm() { 
    char username[100], password[100]; 
    printf("Username: "); 
    scanf("%[^\n]", username); 
    printf("%s", username); 
    printf("Password: "); 
    scanf("%[^\n]", password); 
    printf("%s", password); 
} 

自分のユーザー名は、それだけでこのように、大混乱に行く:のscanf 2015

Username: Tenzo 
Password: Tenzo╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠Tenzo 

を私は以来、混乱していますコードでは、ユーザーにパスワードを入力する前に「ユーザー名」を最初に印刷したいのですが、わかるように、パスワードには何も入力していませんが、すでにわかるように、そのように見えます。 VS2010のコードをテストしたところ、すべて正常に動作しています。私は何が起こっているのか分からない。

注:このコードはC++ではなく、Cで書かれています。

+0

パーセント記号の前にスペースを入れて試してください: '"%[^ \ n] "'また、 'scanf'の' username'と 'password'の前にアンパサンドを書く必要はありません。 – user3386109

+0

おっと、申し訳ありませんが、私はアンパサンドに気づいていませんでした。私はそれを取り除いた。そしてうわー、それは動作します!あなたは答えとしてコメントを設定することができないので、何が起こっているかについての詳細情報を返信するには、回答モードを使用したいと思うかもしれません:) – TenzoNakami

+0

'scanf'関数は空白(改行のような)の読み込みを停止します。入力バッファ内の改行は、指定したバッファにコピーされません。そのため、 ''%99s "'形式が '' scanf'呼び出しのために十分でなければなりません。実際、 ''%["' '書式を使うと、先行する空白をスキップしないので問題が発生します。したがって、2回目の 'scanf'呼び出しは前回の呼び出しから改行を読み込みます。 –

答えて

1

"%[^\n]"フォーマット指定子は、入力バッファに改行を残すという問題があります。次のscanfは、%[]フォーマット指定子がデフォルトで先頭の空白をスキップしないため、その改行をスキップしません。 (これとは対照的に、は、デフォルトでは空白をスキップします。%s%d%fのような書式指定子のほとんど)

を問題を解決するために、あなたはとても

のように、フォーマット文字列の先頭にスペースを置くことができます
scanf(" %[^\n]", password); 
    ^this space forces scanf to skip any leading whitespace, including newlines 
+0

答えを教えていただきありがとうございました! :) Btw、fflush(stdin)は各scanfの後でうまく動作するはずですか? – TenzoNakami

+0

@TenzoNakami C仕様によれば、fflushは出力ストリームと更新ストリーム(§7.21.5.2)でのみ許されます。しかし、[Microsoftは入力ストリームで許可しています](https://stackoverflow.com/a/34247021/3386109)、私はそれをあなたに任せて決定します。 – user3386109

+1

さて、私は今、それを試みましたが、うまくいきません。名前:まあ、私はちょうどあなたの答えに固執するよ! :) – TenzoNakami