• ベストアンサー

gets_sがうまく動かない

プログラムで、はじめにscanf_sで数値入力させ、 次にgets_sで文字列入力させようとするのですが、 入力できずに通過してしまいます。何故なのでしょう? ==プログラム== scanf_s~~数字+エンター gets_s~~通過してしまう gets_s~~文字列入力可

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

>あくまでもscanf_sを用いつつ、通過させない方法はあるのでしょうか? scanf_s~~数字+エンターの直後に rewind(stdin); を入れてみてはいかがでしょうか。 参考URLの受け売りなので、自信なしです。

参考URL:
http://www13.plala.or.jp/kmaeda/cpp_cli/scanf.htm
hardtechno
質問者

お礼

非常に参考になりました! ありがとうございました!

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

#3 の rewind(stdin); でも動くかもしれませんが, 可能なら scanf_s("%d\n", &x); あるいは scanf_s("%d%*[^\n]\n", &x); のように明示的に改行コードを処理した方がよいと思います. 後者の方が安全か な?

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

全てgets_sで統一されてはいかがですか。 その場合、最初は、数字を入力させますが、文字として入ってきます。 ですので、これを、atoi関数などで、int型に変換します。

hardtechno
質問者

お礼

あくまでもscanf_sを用いつつ、通過させない方法はあるのでしょうか?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

お約束パターンなんだろーなー. scanf_s で数値を入力したときに, 最後に打った「エンター」が残っていて, それが次の gets_s で読み込まれています.

hardtechno
質問者

お礼

そうなんでしょうねぇ・・ 何か解決策はないものでしょうか? 今はダミーでgets_sを二重にしてますが・・

関連するQ&A

  • scanfの入力をgets関数で読み捨てることについて

    -------------------------------------- #include<stdio.h> int main(void) { double dt=0.0,sum=0.0; char ss[80]; int ret; ret=scanf("%lf",&dt); puts(""); if(ret!=1){ gets(ss); printf("数値を入力してください\n"); puts(""); } while(dt!=999){ sum=sum+dt; ret=scanf("%lf",&dt); puts(""); if(ret!=1){ gets(ss); printf("数値を入力してください\n"); puts(""); } } printf("合計=%f\n",sum); return 0; } -------------------------------------- 以上のプログラムで、入力した数値の合計を出し「999」が入力されたら終了させ、数値以外が入力されたら、gets関数で読み捨て入力を続けていくということをしたいのですが、例えば、 ◎1----------- 2 3 4 999 合計=9.000000 --------------- ◎1のように数値のみだと正しく表示されます。 次に、 ◎2-------------------- a 整数を入力してください b 整数を入力してください 2 3 999 合計=5.000000 ------------------------ ◎2のように数値以外を先に入力し、その後に数値を入力しても正しく表示されます。 次に、 ◎3------------------- 2 3 a 数値を入力してください b 数値を入力してください 999 合計=11.000000 ----------------------- ◎3のように数値を入力した後に、数値以外を入力したら正しく表示されません。 次に、 ◎4-------------------- 2 a 整数を入力してください b 整数を入力してください 3 999 合計=9.000000 ------------------------ ◎4のように数値をまず入力しその後、数値以外を入力する。その後、数値を入力して終了させても、合計値が正しく表示されません。 まだ、バッファについて完全に理解していないということもあり、何故こうなってしまうのか分かりません。 教えていただけると嬉しいです。

  • "gets"は危険なのでしょうか?

    以下をコンパイルした際に"gets function is dangerous and should not be used "と警告が出ました。直訳すると"getsは危険だから使わないほうが良い"となるのですが、今私の使用している教本には"'gets'に代わる文字列入力の便利な方法は無く、入力文字数が配列を超えないように"との注意しかなく、それは厳守しています。プログラムがいけないのでしょうか。 #include <stdio.h> int main(void) { char str[80]; int i; printf("文字列を入力してください(80文字以下): "); gets(str); for(i=0; str[i]; i++) printf("%c", str[i]); return 0;

  • Rubyのgets関数について

    以下のプログラムを実行して、コマンドプロンプトからsと入力してEnterを押すと、differentと表示されます。sameと表示されることを期待しています。何が原因なのでしょうか?環境はWindows2000です。よろしくお願いします。 i = gets t = "s" if i == t print "same" else print "different" end

  • 文字列ポインタとgets関数の関係について。

    以下のプログラムはコンパイルは出来ますが、 実行するとクラッシュしてしまいます。 gets関数は char *gets( char *str ); と定義されているので文字列の先頭アドレスを返すはずですが 何故このプログラムはエラーが出るのでしょうか・・。 #include <stdio.h> int main ( void ){  char *p, *s;  p = gets(s);  printf("%s", p);  return 0; }

  • scanf と gets について

    以下のプログラムを見てください。 char filename[20]; gets(filename); if((fp = fopen(filename, "r") == NULL) { -------- -------- } もうひとつはこれです。 char filename[20]; scanf("%s", filename); if((fp = fopen(filename, "r") == NULL) { -------- -------- } 上では実行できましたが、下ではダメでした。 なにか初歩的なミスをしてるようなんですが、わかりません。 教えていただきたいのですが。

  • scanf("%s", buf);でスペースを含んだ文字

    コンソールプログラムで scanf("%s", buf); を使用してユーザに入力された文字によって処理を行いたいのですが、このままではスペースを含む文字列がスペースの手前で切られてしまいます。 C:\Program Filesなどを入力可能にさせたい場合にはどのようにするのがベターですか?

  • C言語

    (a) キーボードから入力された文字列をそのままディスプレイに表示するプログラムを作成しなさい。 という問題 #include<stdio.h> main() { char word[1000]; /*文字型の変数の宣言*/ scanf("%s", word); /*キーボードから文字列を入力*/ printf("%s\n", word); /*入力した文字列を出力*/ } と作りましたがこれではコンソール中で文字を打ってからエンターを押さないといけないからといわれ再提出になってしまいました。 エンターを押さないでそのまま出力するということは、できるのでしょうか? あと自分の作ったプログラムではスペースや改行を使うことができないから使えるようにしろと言われてましたがそれわできますか? 変換仕様をかえればいいのですか ほかにもかえる所はありますか?

  • getsの部分がとばされてしまう

    #include<stdio.h> typedef struct Car{ char name[20]; int num; double gas; }Car; int main(void) { Car car[3]; int i; for(i=0;i<3;i++){ printf("ナンバーを入力してください。\n"); scanf("%d",&car[i].num); printf("車の名前を入力してください。\n"); gets(car[i].name); printf("ガソリン量を入力してください。\n"); scanf("%lf",&car[i].gas); } printf("name\tnumber\tfuel\n"); for(i=0;i<3;i++){ printf("%s\t%d\t%f\n",car[i].name,car[i].num,car[i].gas); } return 0; } …上記のようなプログラムを書いたのですが、実行すると、gets(car[i].name);の部分の処理が飛ばされてしまい、入力することができません。 どのようにしたらよいか、教えていただけませんでしょうか。 よろしくお願いいたします。

  • charと%c , %s の関係について

    char型の変数の扱いで悩んでいます。 具体的には以下の二つのプログラムの差異についてです。 ---------------------- char c; scanf("%c", &c); printf("%c\n", c); ----------------------- char c; scanf("%s", &c); printf("%s\n", &c); ----------------------- 上のプログラムは正しいと思うのですが、下のプログラムが正しいのかどうか、わかる方に教えていただきたいと思い質問させていただきました。 どちらのプログラムも問題なく動作します。 僕自身は 下のプログラムの printf 関数については間違った使い方なのではないかと思っています。 scanf("%s", &c) は入力された文字のうち、終端文字の手前までの文字を引数のポインタが示すオブジェクトへ順に格納していく関数だと理解しているので、入力された文字が一文字だった場合、&cの示すオブジェクトに文字が代入されると考えたからです。 逆に printf("%s", &c) は、&cの示すオブジェクトから”ヌル文字”の手前までの文字列を順に表示する関数だと理解しているので、問題なく動作しているのは&cで示されるオブジェクトの後ろの領域が偶然'\0'だったからではないかと考えたからです。 何かの本で、未使用の領域は0である確率が高いという記述をみたことがあり、'\0'は0と同じだということなので問題なく動作する率が高いのではないかと思っています。 僕の考え方がどの程度正しくて、正確にはどうなのかを教えて欲しいです。 ちなみに、 ----------------------- char c; char str[100]; scanf("%s", str); scanf("%c", &c); ------------------------ と書くと c には改行文字が代入されてしまいます。 scanf("%s", str); において"aasssdd "と最後に空白を入れると c には空白文字が代入されます。 しかし、 -------------------------- char str1[100]; char str2[100]; scanf("%s", str1); scanf("%s", str2); -------------------------- においては、 scanf("%s", str1); で "asdfg "と最後に空白を入れても次のstr2が空白で始まることはありません。 この辺りの処理がどのような法則で実行されているのかが分かりづらくて悩んでいます。 おそらく、 scanf("%s", str); の場合には最初の文字が空白や改行文字でも、その次に有効な文字があればそれらの改行や空白を無視するのではないかと思っています。 分かる方がいましたら回答をよろしくお願いします。

  • scanf()関数は不安定

    今晩は、Cの初心者です、宜しくお願いします。 参考書を読んでると「数値をキーボードからとる場合、scanf()関数を使う場合は不安定な動きをする場合があるので、gets()関数で値を文字配列としてとりその後数値に変換するのが良い」と書いていました。 この意味が良く理解できないのですが、scanf()関数よりgets()関数が安定しているということでしょうか。 それとも、数値列としてキーボードからとるよりも、文字列としてとってやった方がよいという意味でしょうか。 宜しくお願いします。

専門家に質問してみよう