2016-10-06 11 views
-4

私は、ユーザーの入力に名前を入力するよう要求するコードを書こうとしています。それで、名前のそれぞれの文字を読み、それをフォーマットすることになっています(以下のコードでは、各文字の後に改行が追加されます)。文字列の最初の文字が印刷されないのはなぜですか?

私が抱えている問題は、誰かが名前を入力したときに、最初の文字は印刷されずに残りの部分が印刷されるということです。

たとえば、私がSneekを入力すると、それはneekしか表示されません。

私はプログラミングの初心者であり、さらにC言語のため、scanf文やループに問題があるかどうか疑問に思っていました。

また、私はSneekを入力するとneekと表示されますが、もう一度Sneekを入力するとSneekと表示されるので、ループに何も間違っているとは思いませんか?

私はこの問題についてかなりの間検索しましたが、私は答えを見つけることができないようです。どんな助けでも大歓迎です。

char ch; 
printf("Please enter name: "); 
ch = scanf("%c", &ch); 

while ((ch = getchar()) != EOF) { 
    printf("%c\n", ch); 

} 
return 0; 
+0

http://stackoverflow.com/questions/35356322/difference-between-int-and-char-in-getchar-fgetc-and-putchar-fputc – Lundin

+1

'getchar'意図的に、' int'を返します'char'ではなく! 'ch = scanf(...、&ch)'は間違っています。使用する関数のドキュメントを読んでください! – Olaf

答えて

2

複数の問題は、コードの断片であります

  • ch = scanf("%c", &ch);は目的を達成しませんし、でもきちんとchにファイルからバイトを読み取ることはありません。 scanfは、chにバイトを格納しますが、戻り値をchに格納するとすぐに上書きされます。ただこの行を削除してください。

  • while ((ch = getchar()) != EOF) { printf("%c\n", ch); }あなたの目的のために正しいですが、chのタイプはunsigned charのすべての値および特別な値EOFに対応するためにintの代わりcharでなければなりません。現時点では、charが符号なしタイプのプラットフォームでは、ファイルの最後にコードが停止しません。

+0

'scanf()'は役に立ちませんが、 "ファイルからバイトを正しく読み込めません"という問題は何のために私は同意しますか?キャラクターが正常に読み取られたかどうかをチェックしないという文句がない限り、「I/O操作が機能していることを確認していない」と違って、キャラクターのキャラクターが異なっているかどうかをチェックしない限り、 –

+0

@JonathanLeffler:違反している 'scanf()'は、ファイルからバイトを読み込み、 'ch'に格納し、成功すれば1を返し、同じ変数' ch'に格納されます。引数のために、バイトはストリームから正しく読み込まれますが、その値は今後の使用のために適切に格納されません;-) – chqrlie

+0

Ah;私は 'ch'への代入を忘れていました(引数リストで使用するだけでなく)。はい;それはすごいですし、 "正しく読まない"というのは正確です。私はその虐待を発見したはずですが、おそらくあなたはそれがどれほど悪いかを指摘することができます(誰にも明らかではないかもしれません)。 –

2

ch = scanf("%c", &ch);をコメントアウトしてください。あなたは最初の文字を消費しており、決してそれを印刷しません。

0

この文は、標準入力からscanfを介して文字を読み取ります。

ch = scanf("%c", &ch); 

このループは、getcharによって標準入力から文字を読み取ります。

while ((ch = getchar()) != EOF) { 
    printf("%c\n", ch); 

} 

scanfで読み取った後の最初の文字はどうなりますか?それはgetcharの結果で上書きされます。

0

問題は表示されません。あなたは最初の文字を取得します。その後、EOFまで文字を取得して印刷します。

最初の文字は表示されません。

関連する問題