
対話式のプログラムを作成したのですが、fgetsのところで勝手に文字が入力されてるような処理になってしまい、こちら側から入力できません。
fgetsのところで通常通り入力できるようにするにはどうしたら良いのでしょうか?
コードは以下のとおりです。
#include <stdio.h>
#include <string.h>
main()
{
int kazu;
char sentaku[1];
char string[10];
printf("文字を入力してください\n"); /*文字入力要求のメッセージ*/
fgets(sentaku,1,stdin); /*確認時にenterを読み込まないようにfgetsで文字取得*/
sscanf(sentaku,"%d",&kazu);
putchar(sentaku[1]); /*putcharを使ってmojiを画面出力*/
putchar('\n'); /*改行コードを出力*/
printf("ここから先に進みますか?-Y/N->\n");
fgets(sentaku,1,stdin); /*確認時にenterを読み込まないようにfgetsで対話する*/
sscanf(sentaku,"%d%",&kazu);
if(sentaku[0]==121) /*入力した文字がyだった場合*/
{
strcpy(string,"spring\n"); /*strcpyを使って変数に代入*/
putchar(string[0]); /*putcharを使って画面出力*/
putchar(string[1]);
putchar(string[2]);
putchar(string[3]);
putchar(string[4]);
putchar(string[5]);
}
}
No.6ベストアンサー
- 回答日時:
fgets() は、「第2引数で指定した文字数-1」分だけ入力ストリームから読み込んで、その後ろに '\0' を付加します。
ですので、第2引数に 1 と指定した場合には、1-1=0 文字分、つまり一文字も読み込まずに処理をすり抜けることになります。
たとえば、以下のようなコードを書いたとしましょう。
--------------------------------------------------------
char hoge[256];
fgets( hoge, 5, stdin );
--------------------------------------------------------
ここで標準入力から「abcdefg[ENTER]」と入力した場合、hoge[] には { 'a', 'b', 'c', 'd', '\0' } が設定されます。
また、標準入力から「hij[ENTER]」と入力した場合、hoge[] には { 'h', 'i', 'j', '\r', '\0' } が設定されます。
# どうしてこのようになるのかは、ご説明するまでもありませんよね?
ですので、「/*確認時にenterを読み込まないようにfgetsで文字取得*/」というコメントから判断すると、この場合には入力文字数を 1 から 2 にすれば良いことになります。
# 変数 sentaku[] の配列要素数も増やすことをお忘れなく。。。
あと、一つ気になったのが「121」という数字です。
この場合、小文字の 'y' を意味しているのであれば、
if(sentaku[0]=='y')
……
としたほうが良いです。
ま、今回のご質問とは関係ない話ですけど。。。
No.5
- 回答日時:
No3のものです。
何度もすみません。>また、私の書いたinput関数は、戻り値がintにもかかわらず、charを返しています。本当は0か1を返すようにするつもりでした。
は、さらに私の勘違いでした。
ごめんなさい。
No.4
- 回答日時:
すみません、No3の者です。
みっとも恥ずかしいことにいくつか間違ってしまいました。
fgetsに渡す引数としての文字数は、\0の分はいらないし、'\n'の分も勿論入れなくてもOKです。
また、私の書いたinput関数は、戻り値がintにもかかわらず、charを返しています。本当は0か1を返すようにするつもりでした。
混乱させてしまったら、すみません。
No.3
- 回答日時:
私の環境の解説によると、fgets関数は以下のように動作します。
/*
char *fgets(char *s, int n, FILE *stream);
解説
ストリームから文字列を取得します。
fgets は,stream から文字を読み込んで文字列 s に格納します。読み込みは n-1 個の文字を読み込むか,または改行文字を読み込んだときに終了します。改行文字で終了した場合には fgets は,s の最後に改行文字を格納します。s に読み込まれた文字の最後にはヌルターミネータが付加されます。
*/
ですから、\0の分の+1に加え、改行文字の分を指定するのが正しいと思います。もちろんメモリもそれだけ確保する必要があります。また、改行文字を除去するのには、処理系依存にしなくても、fgetcあたりを使って、別関数にするのかよいと思います。
たとえば、
int input(char *buffer,int n , FILE *stream){
int i,c;
for( i=0; i<n; i++){
c=fgetc(stream);
if((c=='\n') || (c=='\0')){
*buffer='\0';
return 1;
}
*buffer++=c;
}
*buffer='\0';
return 1;
}
こんな感じでしょうか?
前述したように、
>char sentaku[1];
は、一文字分じゃ少なすぎで、リターンを打った時点でメモリをはみ出してしまいますし、
>putchar(sentaku[1]); /*putcharを使ってmojiを画面出力*/
は,sentaku[0]じゃないかと思います。
がんばって、C言語における文字列の扱いを習得してください。
No.1
- 回答日時:
>fgets(sentaku,1,stdin);
は意味がありません、1から1を引いた0文字しか読みません、1文字も読まずに処理を続けます。
enterを読まずに処理をするには、処理系依存の関数で入力するしか方法はありません。
OS名、コンパイラー名を詳細に記述してください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- Visual Basic(VBA) 該当セルに行替えを含むデータを命令文に入れて、2行に表示したい。 5 2023/07/20 11:51
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語の初心者です。これを実行...
-
cプログラミングについて
-
C言語:配列の中の文字を。。。
-
文字列の操作
-
プログラムのことで
-
c言語 scanf
-
文字列の途中に「0」がある場...
-
Cで「大文字、小文字の判定」は...
-
今回のC言語の質問は以下の内容...
-
C言語で16進数文字列から16進数...
-
Visual Studio 処理能力(?)...
-
構造体の各メンバにfor文からア...
-
「Aに対するBの割合」と「Aに対...
-
C言語で%を使わない余りの出し方
-
基本的ですが・・・
-
複数のアドレスを関数から取得...
-
ランダムアクセスができない
-
9-3の時の内部処理・・・
-
高(1)男子 初めてC言語でコー...
-
C++言語で、どうこのコード続け...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
fgetsで拾われる改行文字を削除...
-
sscanfとscanfの違いがよくわか...
-
反転した数値を表示させるやり方
-
charと%c , %s の関係について
-
fgets関数を使用したときの文字...
-
Cで「大文字、小文字の判定」は...
-
strstrを利用しない文字列検索...
-
文字列中に含まれる文字の個数...
-
C言語のステップ数をカウントす...
-
itoaわかりません
-
C++
-
C/C++言語で日本語処理
-
C言語 空白の行(改行のみ)が...
-
CStringについて
-
小文字のみを数える方法
-
教えていただけませんか?C言語...
-
ブランクのチェック
-
str[j++]の意味
-
初歩的なプログラムなんですが...
おすすめ情報