質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

354閲覧

文字列における空白文字の仕様

salah0615

総合スコア49

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2019/06/12 18:06

編集2019/06/12 18:55

C言語の文字列の扱い方についてまだよくわからないところがあります。

c

1#include <stdio.h> 2 3int main(void) { 4 char c[30]; 5 printf("Please write words\n"); 6 scanf("%s", c); 7 printf("c = %s\n", c); 8 9 printf("Please write words\n"); 10 scanf("%s", c); 11 printf("c = %s\n", c); 12 return 0; 13} 14 15// 実行結果 16Please write words 17I have a pen 18c = I 19Please write words 20c = have

例えばこのプログラムによると、空白文字のところで一旦出力が切れます。
しかし、簡単に次のようなプログラムをmain関数の中に加えてみます。

c

1char str[30]; 2 for(int i = 0; str[i] != '\n'; i++) { 3 do { 4 scanf("%c", &str[i]); 5 } while(str[i] == '\n'); 6 if(str[i] == '0') break; 7 } 8 9 printf("%s", str); //結果 i have a pen

一文字ずつ、i, ,h,a,v,e, ,a, ,p,e,nと入力すると、結果は上記のようになります。
つまりここでは空白文字(' ')が一つの文字として認識されているということになります。
何故前者のコード(scanf)では空白文字が現れると、素直に文字として出力せずに切るのでしょうか。

追加の疑問

上の二つのコードをそのままくっつけた結果
結果は
Please write words
I have a pen
c = I
Please write words
c = have
i

h
a
v
e

a

p
e
n
0
a peni have a pen(はじめのaの左にも空白があります。)
となりました。途中の0は入力を終わらせるために便宜的に入れたものです。
ここで最後の行を見てください。
I have a penの左にa penが出力されました。
これは明らかにc[]の残りです。
str[]とc[]は全く違うものなのに何故このようなことになってしまうのでしょうか。

分かる方解説をお願いします。

修正

すみません。追加の質問に関してはなんとなく察しがついています。
一度I have a penという文字列がscanfによってバッファかどこかに入れられて、残った文字列( a pen) が仕方なく出力されてしまった。

この解釈が間違っていた場合、教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

scanfの%sの仕様です

1行が欲しいのならばfgetsを用いてください。

投稿2019/06/12 23:53

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

salah0615

2019/06/13 08:00

ありがとうございます。 上記のリンク、とても参考になりました。
guest

0

何故前者のコード(scanf)では空白文字が現れると、素直に文字として出力せずに切るのでしょうか。

前者は "%s" であり, 後者は "%c" です. パラメータが異なりますので必ずしも同じ動作とは想定出来ないのではないでしょうか.
ドキュメントだけでは物足りない, 詳細な動作をお知りになりたいのでしたら, scanf のソースをお探しになっては如何でしょう.

scanfによってバッファかどこかに入れられて

scanf は標準入力からデータを得ています. 標準入力とはどういうものか, お調べになっては如何でしょうか.

投稿2019/06/12 23:47

jimbe

総合スコア12545

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

salah0615

2019/06/13 07:56

わかりました。 調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問