←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.4070

scanfとgetsを使うとき
投稿者---名無し(2005/06/24 17:45:23)


char str[80];
  char *p;
  int c;
  int num=0;
  while(num!=1&&num!=2)
    {
      printf("MENU:\n");
      printf("1.Input charactors by means of gets(),output them by means of putchar().\n");
      printf("2.Input charactors by means of getchar(),output them by means of puts().\n");
      printf("Please choose 1 or 2:");
      scanf("%d",&num);
      if(num!=1&&num!=2)printf("Try again!\n");
    }
  printf("Please input charactors:");
  switch(num){
  case 1:
    p=gets(str);
    process1(p);
    break;


最初に数字を入力させ、それに応じた処理をするというプログラムですが、
scanfでの入力の後でgetsを使ってもうまく入力できません。対処法はありませんか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:scanfとgetsを使うとき 4071 REE 2005/06/24 18:15:07
<子記事> Re:scanfとgetsを使うとき 4106 RiSK 2005/06/27 11:11:10


No.4071

Re:scanfとgetsを使うとき
投稿者---REE(2005/06/24 18:15:07)


>最初に数字を入力させ、それに応じた処理をするというプログラムですが、
>scanfでの入力の後でgetsを使ってもうまく入力できません。対処法はありませんか?

この掲示板から、ホームページである
http://www9.plala.or.jp/sgwr-t/
の5章の4節を見てください。



この投稿にコメントする

削除パスワード

No.4072

Re:scanfとgetsを使うとき
投稿者---名無し(2005/06/24 18:20:09)


scanfを使う時の回避方法はあるのですが、getsを使うときの回避方法が分かりません。getsは使えないのでしょうか?


この投稿にコメントする

削除パスワード

No.4075

Re:scanfとgetsを使うとき
投稿者---REE(2005/06/24 19:02:09)


>scanfを使う時の回避方法はあるのですが、getsを使うときの回避方法が分かりません。getsは使えないのでしょうか?

getsが上手くいかないのは、その前のscanfで改行が入力バッファに残るためです。
そのため、同じ回避方法で解決できます。


この投稿にコメントする

削除パスワード

No.4098

Re:scanfとgetsを使うとき
投稿者---名無し(2005/06/27 10:01:02)


>getsが上手くいかないのは、その前のscanfで改行が入力バッファに残るためです。
>そのため、同じ回避方法で解決できます。

いろいろと試してみたのですが、同じ回避方法と言うのが良く分かりません。具体的に教えて頂きたいのですが


この投稿にコメントする

削除パスワード

No.4099

Re:scanfとgetsを使うとき
投稿者---まきじ(2005/06/27 10:12:33)


>いろいろと試してみたのですが、同じ回避方法と言うのが良く分かりません。具体的に教えて頂きたいのですが

fflush や rewind はどうでしょうか?


この投稿にコメントする

削除パスワード

No.4100

Re:scanfとgetsを使うとき
投稿者---RiSK(2005/06/27 10:14:07)


>fflush や rewind はどうでしょうか?

NG. stdin に使っちゃだめよ。


この投稿にコメントする

削除パスワード

No.4101

Re:scanfとgetsを使うとき
投稿者---名無し(2005/06/27 10:16:59)


>fflush や rewind はどうでしょうか?

学校の課題なのでgets限定なんです


この投稿にコメントする

削除パスワード

No.4103

Re:scanfとgetsを使うとき
投稿者---まきじ(2005/06/27 10:28:49)


>学校の課題なのでgets限定なんです

gets() に問題があるのではなく、scanf() に問題がある
対処方法は、REEさんの仰ってる通りです。

#つい、fflush や rewind を勧めてしまう(^^;
#stdin に対しての、fflush や rewind は動作が不定だから NG


この投稿にコメントする

削除パスワード

No.4104

不定とは<was: Re:scanfとgetsを使うとき>
投稿者---RiSK(2005/06/27 10:40:53)


>#stdin に対しての、fflush や rewind は動作が不定だから NG

「不定」ではなく「未定義」ね。

C言語には「不定」という語はありません。
「不定の値」という語ならあります。
3.17.2 不定の値(indeterminate value) 未規定の値又はトラップ表現。



この投稿にコメントする

削除パスワード

No.4105

Re:不定とは<was: Re:scanfとgetsを使うとき>
投稿者---まきじ(2005/06/27 10:51:23)


>「不定」ではなく「未定義」ね。

ご指摘有難うございます。以後、気を付けます。



この投稿にコメントする

削除パスワード

No.4108

Re:scanfとgetsを使うとき
投稿者---REE(2005/06/27 12:57:29)


>>getsが上手くいかないのは、その前のscanfで改行が入力バッファに残るためです。
>>そのため、同じ回避方法で解決できます。
>
>いろいろと試してみたのですが、同じ回避方法と言うのが良く分かりません。具体的に教えて頂きたいのですが

どう試したのか具体的に示してください。



この投稿にコメントする

削除パスワード

No.4106

Re:scanfとgetsを使うとき
投稿者---RiSK(2005/06/27 11:11:10)


>scanfでの入力の後でgetsを使ってもうまく入力できません。対処法はありませんか?

scanf で改行まで読み捨てるサンプル:
#include <stdio.h>
int main(void) {
    int i; char s[256];
    scanf("%d%*[^\n]%*c", &i);
    gets(s);
    printf("num [%d], s [%s]\n", i, s);
    return 0;
}

getchar で改行まで読み捨てるサンプル:
#include <stdio.h>
int main(void) {
    int i, c; char s[256];
    scanf("%d", &i);
    while ((c = getchar()) != '\n') ;
    gets(s);
    printf("num [%d], s [%s]\n", i, s);
    return 0;
}



この投稿にコメントする

削除パスワード

No.4107

Re:scanfとgetsを使うとき
投稿者---かずま(2005/06/27 12:12:06)


> scanf で改行まで読み捨てるサンプル:

そのサンプルは、scanf にバグのある Borland C++ Compiler でしか
思うように動きません。


この投稿にコメントする

削除パスワード

No.4109

Re:scanfとgetsを使うとき
投稿者---RiSK(2005/06/28 17:04:55)


>そのサンプルは、scanf にバグのある Borland C++ Compiler でしか
>思うように動きません。

仰るとおりでした。毎回の指摘に感謝します。
私のコードにバグがあることには,すぐに気が付きましたが,
その理由が分かるまでに,だいぶ時間が掛かってしまいました。

> scanf("%d%*[^\n]%*c", &i);

123(改行) と入力したとき:
  1. %d で 123 がマッチします
  2. %*[^\n] で 改行文字 がマッチしません
  3. %*c が評価されることなく scanf を抜けます
  4. 次の gets で自動的にバッファに残っている 改行文字 が入力されます
数字と改行文字の間に何らかの文字があれば
%*[^\n] でマッチして,次の %*c で改行文字が捨てられます。

# 強調部分は私が誤解していた部分です。
# そりゃぁ,もう悩みまくりました。

問題を解決するためには
・改行文字の直前までを捨てる(すぐに改行文字の場合は何もしない)

・改行文字を捨てる
の両方を行う必要があります。

scanf で改行文字まで読み捨てるサンプル改:
#include <stdio.h>
int main(void) {
    int i; char s[256];
    scanf("%d%*[^\n]", &i);
    scanf("%*c");
    gets(s);
    printf("num [%d], s [%s]\n", i, s);
    return 0;
}
これで問題ないでしょうか?


この投稿にコメントする

削除パスワード

No.4110

Re:scanfとgetsを使うとき
投稿者---かずま(2005/06/29 02:34:12)


> scanf で改行文字まで読み捨てるサンプル改:
> #include <stdio.h>
> int main(void) {
>     int i; char s[256];
>     scanf("%d%*[^\n]", &i);
>     scanf("%*c");
>     gets(s);
>     printf("num [%d], s [%s]\n", i, s);
>     return 0;
> }
> これで問題ないでしょうか?

問題ないでしょう。

さて、Borland C++ Compiler のバグですが、次のプログラムで分かります。

#include <stdio.h>

int main(void)
{
    int n, i = 9;  char a[256] = "x", b[256] = "y";
    n = scanf("%d%[a]%s", &i, a, b);
    printf("n=%d, i=%d, a=%s, b=%s\n", n, i, a, b);
    return 0;
}

入力: 123abc 
出力: n=3, i=123, a=x, b=bc

入力: 123def
出力: n=1, i=123, a=x, b=y   (gcc, VC++, LSI C-86)
出力: n=2, i=123, a=x, b=def (BCC)



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity