- ベストアンサー
scanf("%s", buf);でスペースを含んだ文字
コンソールプログラムで scanf("%s", buf); を使用してユーザに入力された文字によって処理を行いたいのですが、このままではスペースを含む文字列がスペースの手前で切られてしまいます。 C:\Program Filesなどを入力可能にさせたい場合にはどのようにするのがベターですか?
- みんなの回答 (3)
- 専門家の回答
関連するQ&A
- fscanf(),scanf()とBuffer Overflow
scanf("%s", buf); で、bufの長さはどれくらいに取ればよいのでしょう。 sscanf(buf,"%s",buf2); なら、sizeof(buf)以上に大きくならないでしょうが、scanf(), fscanf()で文字列を読み込むときは、Buffer Overflowの危険から逃れられないような気がしています。 私はそのため、文字列を扱うときには、この二つの関数を使わないでいるのですが、安全な使用方法はあるのでしょうか? scanf("%10s",buf); のような使い方は知っています。でもこれでは文字数が10文字だったのか、それ以上だったのか判別できません。知りたいのは最大文字数が未知の場合です。 こう使えば安全という使い方があればぜひご紹介ください。
- ベストアンサー
- C・C++・C#
- 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); の場合には最初の文字が空白や改行文字でも、その次に有効な文字があればそれらの改行や空白を無視するのではないかと思っています。 分かる方がいましたら回答をよろしくお願いします。
- ベストアンサー
- C・C++・C#
- 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回の入力でプログラムが終了してしまいます。 どこが間違っているのでしょうか(>_< どなたかご指導お願いします:;
- ベストアンサー
- C・C++・C#
- gets_sがうまく動かない
プログラムで、はじめにscanf_sで数値入力させ、 次にgets_sで文字列入力させようとするのですが、 入力できずに通過してしまいます。何故なのでしょう? ==プログラム== scanf_s~~数字+エンター gets_s~~通過してしまう gets_s~~文字列入力可
- ベストアンサー
- C・C++・C#
- 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・C++・C#
- C言語
(a) キーボードから入力された文字列をそのままディスプレイに表示するプログラムを作成しなさい。 という問題 #include<stdio.h> main() { char word[1000]; /*文字型の変数の宣言*/ scanf("%s", word); /*キーボードから文字列を入力*/ printf("%s\n", word); /*入力した文字列を出力*/ } と作りましたがこれではコンソール中で文字を打ってからエンターを押さないといけないからといわれ再提出になってしまいました。 エンターを押さないでそのまま出力するということは、できるのでしょうか? あと自分の作ったプログラムではスペースや改行を使うことができないから使えるようにしろと言われてましたがそれわできますか? 変換仕様をかえればいいのですか ほかにもかえる所はありますか?
- 締切済み
- C・C++・C#
- scanf の%10s について
初歩すぎる質問でもうしわけありませんが、 str[100]という配列を用意して 無限ループ内に while(1){ printf("入力してください>>>"); scanf("%10s",str); } などとして、実行して 10文字以上入力すると、 「入力してください>>>」が一回ではなく 「入力してください>>>入力してください>>>」 のように複数でるのですが、なぜでしょうか?? なにがおきているのでしょうか??
- 締切済み
- C・C++・C#
- C言語 if文でscanf関数
C言語のif文でscanf関数を使って、~と入力されたら・・・(~は文字列)のようなプログラムを作りたいです。どうすれば良いでしょうか?(簡単にお願いします・・・)
- ベストアンサー
- C・C++・C#
- scanf関数について
こんなプログラムがありました。 char str[80]; while(scanf("%s",str)>=1){ ・・・ } このwhileループは何が入力されたときに終了するのですか?scanf関数は入力された文字を返り値に持つとわかったので、改行コードを入力しましたが、終了しませんでした。どうすればよいのでしょう。よろしくお願いいたします。
- ベストアンサー
- C・C++・C#
- fgets関数とscanfについて
fgets関数とscanfの意味が似ていると思うんですが、違いは何ですか? 例えば、fgets( str, 81, stdin ) は変数strに80文字制限で、標準入力から入力するという意味ですよね? scanf("%s",s)は変数sに文字列を入力するという意味ですよね? 意味が似てると思うんですが、実際は何が違うんでしょうか? 回答よろしくお願いします。
- ベストアンサー
- C・C++・C#
- インターネットを開く際、富士通FMVの立ち上がりが非常に遅い問題が発生しています。4分以上かかることもありますが、一体どこが原因なのでしょうか?
- 富士通FMVのインターネットの立ち上がりが遅い問題に関して、調査をしました。原因でもあるかもしれない要素について解説します。
- 富士通FMVのインターネットを開くときに時間がかかる問題について、おすすめの対策策や改善方法についてご紹介します。快適なインターネット環境を手に入れるためのポイントをまとめました。