teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

一文追加

2020/03/08 15:58

投稿

rubato6809
rubato6809

スコア1382

answer CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  でも、あなたが入力するのは**文字列**のはずです。文字列は文字が並んだ、文字の配列です。たとえば "hello world" は空白文字を含んで、ぜんぶで11文字の文字列です。もっと正確に言うと、文字列の最後には終端文字NUL(== 0x00 == '\0')があり、"hello world" は全部で12文字で構成されている==メモリ上に12文字あることを、どこかで見知ったはずです。
6
6
 
7
- いろんな意味で文字と文字列は似てので、その区別が曖昧な人が初心者には多いです。でもそこを明確に区別できないと、問いと回答というコミュニケーションが成立たなくなってしまう。なので、お小言から入りました。
7
+ 文字と文字列は近しなので、その区別が曖昧な人が初心者には多いです。でもそこを明確に区別できないとコミュニケーションが成立たなくなってしまう。なので、お小言から入りました。
8
8
 
9
9
  > 内容確認をするためのパートで入力したものをprintfを使って表示したい
10
10
 
@@ -20,12 +20,14 @@
20
20
  }
21
21
  ```
22
22
  空白文字を含んだ文字列を %s で表示できることが確認できるはずです。
23
- 単に ``` %s ``` を使え、それが私の回答です。
23
+ **に ``` %s ``` を使え**、それが私の回答です。
24
24
 
25
25
  '\0' で終端する(最後に '\0'がある)ことがC言語の文字列の定義です。上記の printf() は %s 変換指定によって、 line というアドレスから始まる文字列を、順に一文字ずつ、'\0' に出会うまで表示します。途中に空白文字があれば空白文字を表示します。シンプルなルールです。
26
26
 
27
+ "Middle initial(s): %2s%*[^\n]" という複雑な変換指定、特に %2s は2文字幅のところに文字列を表示する指定ですから、結果として2文字しか表示されないのでしょう。そこを単に %s にしてみたらどうですか
28
+
27
29
  > scanfを使って、空白を含んだ文字を入力することは成功した
28
30
 
29
- scanf() はキーボードからの入力を、空白文字で区切るのが基本の動作です。空白文字を含んだ文字列を入力するには、基本と違う動作をさせなければならないので容易ではなかったでしょう。
31
+ scanf() はキーボードからの入力を、空白文字で区切るのが基本の動作です。空白文字を含んだ文字列を入力するには、基本と違う動作をさせなければならないので容易ではなかったでしょう。'\0' を入力して終了する、ということはないので printf() とは事情が違います。
30
32
 
31
33
  scanf()とprintf() の変換指定(フォーマット文字列)は、一見、同じというか、対称的というか、そのように捉えることもできますが、**よくよく見比べてみると違うルール**なのです。scanf() で使った変換指定を、そのまま printf() で使えるというものではありません。