• ベストアンサー

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

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

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

  • ベストアンサー
  • nobe
  • ベストアンサー率66% (59/89)
回答No.3

お任せください! そもそもscanfを使うというのはお勧めでは ありません。scanfは文字+改行文字が入力 されないと完了しないためです。 が、それは良しとしましょう。 scanfの書式ですが、 int n = scanf("%[^\r\n]",buf); という便利な書式があります。 perlでもおなじみの書式ですね。 上記の山文字"^"より前が読み込ませたい文字の集まりで、ハイフン指定が出来ます。 "^"より後ろが読込みを停止させたい文字の集まりです。上記の指定は復帰改行以外の文字が現れるまで読み込みます、という書式です。 下記のような指定も出来ます。 int n = scanf("%[a-zA-Z0-9\\: \t^\r\n]",buf); なお、戻り値は読み込んだ項目数ですので、 if(n >= 1) { } で判断できますね。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4859/10275)
回答No.2

コンソールからの入力は、fgets(buf,sizeof buf,stdin); を使います。 scanfは使い方が難しいので初心者は使わないほうがいいです。特にコンソール入力にはまず使いません。定型書式のファイルから読むときに使うくらいですが、その場合もfscanfかfgets+sscanfを使うでしょう。scanfの存在を忘れてしまってもかまわないです。

全文を見る
すると、全ての回答が全文表示されます。
  • asuca
  • ベストアンサー率47% (11786/24626)
回答No.1

fgetsを使うというのではだめですか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • fscanf(),scanf()とBuffer Overflow

    scanf("%s", buf); で、bufの長さはどれくらいに取ればよいのでしょう。 sscanf(buf,"%s",buf2); なら、sizeof(buf)以上に大きくならないでしょうが、scanf(), fscanf()で文字列を読み込むときは、Buffer Overflowの危険から逃れられないような気がしています。 私はそのため、文字列を扱うときには、この二つの関数を使わないでいるのですが、安全な使用方法はあるのでしょうか? scanf("%10s",buf); のような使い方は知っています。でもこれでは文字数が10文字だったのか、それ以上だったのか判別できません。知りたいのは最大文字数が未知の場合です。 こう使えば安全という使い方があればぜひご紹介ください。

  • 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が2回使えない・・・?;

    scanfが使えなくて困っています。どなたか教えていただけないでしょうか(>_< 現在scanfが2つあるプログラムを作っています。 scanfのあるプログラムを実行すると入力待ち画面になりますよね。以下のプログラムを実行すると 1回目のscanfは入力待ちになるのですが2回目は入力待ちにならずに 最後まで行ってしまいます・・。 void main(){ int b; char d, names[20]; printf("名前入力\n"); scanf("%s", &names); printf("1文字キー入力\n"); scanf("%c", &d); printf("\n名前は %s : キーは %c です。\n", names, d); } 実行結果 -------------------------------------- 名前入力 dra2jp 1文字キー入力 名前は dra2jp : キーは です。 -------------------------------------- 名前入力のところは入力待ちになるのですがキー入力ができずに一気に最後までいってしまい、 つまり2回入力待ちにならなければならないのに1回の入力でプログラムが終了してしまいます。 どこが間違っているのでしょうか(>_< どなたかご指導お願いします:;

  • gets_sがうまく動かない

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

  • for文の中のscanfにスペースが必要な理由を教えてください。

    for文の中のscanfにスペースが必要な理由を教えてください。 以下のようなプログラムを作りました。 10 #include <stdio.h> 20 int main() 30 { 40 printf("入力された英字とその次の英字を出力するプログラムである。\n"); 50 char a; 60 for(;;) 70 {scanf(" %c",&a); 80 if(a=='z'||a=='Z') break;else printf("入力された英字は%cで次の英字は%cです。\n",a,a+1);} 90 printf("終了\n"); 100 } というプログラムを作りました。 70の行のscanfの%cの前にスペースを空けないと実行結果が 「入力された英字とその次の英字を出力するプログラムである。  k  入力された英字はkで次の英字はlです。  入力された英字は  で英字は(よく分からない文字) です。」 という結果になります。 半角スペースを空けると、正常に実行されて 「入力された英字とその次の英字を出力するプログラムである。  k  入力された英字はkで次の英字はlです。」 となります。半角スペース以外もいろいろ試したのですが、どれも正常に実行されませんでした。  この半角スペースはどういう意味なのでしょうか、また、どういう時にこの半角スペースが必要になるのでしょうか、ぜひ教えてください。

  • C言語

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

  • scanf の%10s について

    初歩すぎる質問でもうしわけありませんが、 str[100]という配列を用意して 無限ループ内に while(1){ printf("入力してください>>>"); scanf("%10s",str); } などとして、実行して 10文字以上入力すると、 「入力してください>>>」が一回ではなく 「入力してください>>>入力してください>>>」 のように複数でるのですが、なぜでしょうか?? なにがおきているのでしょうか??

  • C言語 if文でscanf関数

    C言語のif文でscanf関数を使って、~と入力されたら・・・(~は文字列)のようなプログラムを作りたいです。どうすれば良いでしょうか?(簡単にお願いします・・・)

  • scanf関数について

    こんなプログラムがありました。 char str[80]; while(scanf("%s",str)>=1){    ・・・  } このwhileループは何が入力されたときに終了するのですか?scanf関数は入力された文字を返り値に持つとわかったので、改行コードを入力しましたが、終了しませんでした。どうすればよいのでしょう。よろしくお願いいたします。

  • fgets関数とscanfについて

    fgets関数とscanfの意味が似ていると思うんですが、違いは何ですか? 例えば、fgets( str, 81, stdin ) は変数strに80文字制限で、標準入力から入力するという意味ですよね? scanf("%s",s)は変数sに文字列を入力するという意味ですよね? 意味が似てると思うんですが、実際は何が違うんでしょうか? 回答よろしくお願いします。

このQ&Aのポイント
  • インターネットを開く際、富士通FMVの立ち上がりが非常に遅い問題が発生しています。4分以上かかることもありますが、一体どこが原因なのでしょうか?
  • 富士通FMVのインターネットの立ち上がりが遅い問題に関して、調査をしました。原因でもあるかもしれない要素について解説します。
  • 富士通FMVのインターネットを開くときに時間がかかる問題について、おすすめの対策策や改善方法についてご紹介します。快適なインターネット環境を手に入れるためのポイントをまとめました。
回答を見る