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) が仕方なく出力されてしまった。
この解釈が間違っていた場合、教えてください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/13 08:00