C言語でgetchar();が上手く使えずに困っています‼
void input(char *cx, char *cy){
int i,x,y;
printf("x=");
*cx = getchar();
if(*cx != 'q'){
for(i = 0; i < 5; i++)
if(*cx == '0' + i)x = i;
}
printf("¥ny=");
*cy = getchar();
if(*cy != 'q'){
for(i = 0; i < 5; i++)
if(*cy == '5' + i)y = i;
}
}
という関数で、一度目は上手く行くのですが、二度目の実行で*cy = getchar();が行われません。
cx,cyは、関数を呼び出す前に'9'を代入しています。
実行されない原因と改善策を教えて下さい‼
No.2ベストアンサー
- 回答日時:
ついでに言うと、
printf("x=")
のあとで
*cx = getchar();
がキー入力待ちになって見えるのは、たまたまこの時点で標準入力が空だからです。
例えば 432(エンター) と入力したなら、標準入力には
「4」 「3」「2」 「改行」
の4文字が入力され、
*cx = getchar(); で 「4」
*cy = getchar(); で(キー入力待ちにはならずに) 「3」
次に inputが呼ばれたときの
*cx = getchar(); で(キー入力待ちにはならずに) 「2」
*cy = getchar(); で(キー入力待ちにはならずに) 「改行」
となります。
分かりやすい説明ありがとうございます‼
getchar();の後に空読みのプログラムをいれたら上手く行きました‼
ありがとうございました‼
No.3
- 回答日時:
ついでに指摘しておくと for の必然性がわからない.
x = *cx-'0';
のように書かないのはなぜだろうか.
学校の課題で出たものを勝手に発展させているだけで、そこは課題として与えられたときにこうやって値を得なさいと定められているので私にも分かりません。
No.1
- 回答日時:
getchar()は標準入力から1文字読み出します。
この「1文字」は、空白、改行等の「文字」には見えないものも含みます。
よくある環境では、標準入力は特に指定しなければ端末になっています。
端末では、キーボードからの入力を、エンターを入力した時点でまとめて送るようになっています。
端末に
x=
と表示されたときに
3
だけキー入力しても、標準入力へは送られません。その後に
(エンター)
とキー入力した時点で、標準入力に
「3」 「改行」
という「2文字」が送られます。
*cx = getchar();
は、このうち 「3」 だけを読みます。
*cy = getchar();
では、残ってる「改行」を読みます。
何がしたいのかがこのプログラムの意図は読み取れないのですが、設計を根本から見直す必要があると思われます。
※ inputを呼び出す側が欲しいのは、入力された文字(cx,cy)ではなく、その結果(x,y)の方だろうし
なるほど!
二つに分ければ*cyでも入力が新たに行われるかと思ったのですが、そうはいかないんですね。
プログラムは長いので関係のない部分は省いています‼
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# char string[100]; int c, i=0; while( (c=getchar()) 2 2022/05/30 21:41
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
-
getchar()について 教えてください。
C言語・C++・C#
-
fgetsなどのときのstdinのバッファを消すには?
C言語・C++・C#
-
-
4
C++で空Enterの入力を判断したい!!
C言語・C++・C#
-
5
数字以外が入力されたらエラー文を出したい。
C言語・C++・C#
-
6
fflush(stdin)の使い方とprintf()関数getchar()関数の違いについて
C言語・C++・C#
-
7
getchar()を int でとる理由がわかりません
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
正負を反転させて出力するプロ...
-
数字以外が入力されたらエラー...
-
C言語scanf_sで何故か2回入力に...
-
"scanf"でエンターで改行させな...
-
C言語でscanfが認識されません
-
java 入力された文字列を数値に...
-
C言語 逆ピラミッドの作り方
-
プログラム(C)
-
WindowsでEOF
-
scanfが2回使えない・・・?;
-
cout関数を使っているのですが...
-
if文の条件にscanf関数を使うと…?
-
特定の文字が入力されるまで・・・
-
フォルダ作成について
-
4桁の数字以外を入力したらエラ...
-
scanfでの可変引数
-
至急お願いします。プログラミ...
-
scanf("%s", buf);でスペースを...
-
Userformの入力順序をタブオー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
正負を反転させて出力するプロ...
-
数字以外が入力されたらエラー...
-
プログラミング初心者です。 Py...
-
double型が正常に認識されてい...
-
java初心者です。入力されたの...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
C言語scanf_sで何故か2回入力に...
-
if文の条件にscanf関数を使うと…?
-
Linuxで入力待ちなしkeyread関...
-
プログラミングの問題です 「金...
-
ワードで文字を入力する時の変...
-
cout関数を使っているのですが...
-
batプログラム上で文字列を入力...
-
Userformの入力順序をタブオー...
-
scanf が無視されます
-
C言語 逆ピラミッドの作り方
-
gets_sがうまく動かない
-
Excel VBAで、Application.Inpu...
おすすめ情報