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

回答編集履歴

4

追記

2017/10/03 06:49

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -78,4 +78,6 @@
78
78
  for(char *tmp = str; *tmp != '\0'; tmp++){
79
79
  printf("%c\n", *tmp);
80
80
  }
81
- ```
81
+ ```
82
+
83
+ 文字列がヌル終端していることが前提ですが。

3

追記

2017/10/03 06:49

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -59,4 +59,23 @@
59
59
  printf("%c\n", str[j]);
60
60
  ```
61
61
 
62
- こっちの方が配列で慣れ親しんでいる分直感的ですね。
62
+ こっちの方が配列で慣れ親しんでいる分直感的ですね。
63
+
64
+ ついでに
65
+ ---
66
+ 以下の三つはいずれも正解。
67
+ ```C
68
+ for(size_t j = 0; j<5; j++){
69
+ printf("%c\n", str[j]);
70
+ }
71
+ ```
72
+ ```C
73
+ for(size_t j = 0; str[j] != '\0'; j++){
74
+ printf("%c\n", str[j]);
75
+ }
76
+ ```
77
+ ```C
78
+ for(char *tmp = str; *tmp != '\0'; tmp++){
79
+ printf("%c\n", *tmp);
80
+ }
81
+ ```

2

追記

2017/10/03 06:48

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -42,4 +42,21 @@
42
42
  ・**func内でのstrの参照方法の変更**
43
43
  ・ついでに文字列としても出力してみた
44
44
 
45
+ ---
45
- 特に三行目(**太字**)は要注意です。
46
+ 特に上記の三行目(**太字**)は要注意です。この部分ですね。
47
+ > ```C
48
+ > printf("%c\n",str+j);
49
+ > ```
50
+
51
+ `str`に格納されているのはアドレスなので、`%c`で出力すると想定外の結果となります。
52
+ ちゃんと指し示すデータを参照する必要があります。
53
+ ```C
54
+ printf("%c\n", *(str+j));
55
+ ```
56
+
57
+ これは、次のようにも書くことができます。
58
+ ```C
59
+ printf("%c\n", str[j]);
60
+ ```
61
+
62
+ こっちの方が配列で慣れ親しんでいる分直感的ですね。

1

修正

2017/10/03 06:44

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -11,6 +11,7 @@
11
11
  for(size_t i=0;i<5;i++){
12
12
  a[2][i]='b';
13
13
  }
14
+ a[2][5] = '\0';
14
15
  func(max,a[2]);
15
16
  return 0;
16
17
  }
@@ -18,10 +19,27 @@
18
19
  void func(size_t max,char *str){
19
20
  size_t j=0;
20
21
  while(j<5){
21
- printf("%c\n",str+j);
22
+ printf("%c\n", str[j]);
22
23
  j++;
23
24
  }
25
+ printf("%s\n", str);
24
26
  }
25
27
  ```
26
28
 
29
+ **実行結果**
30
+ ```
31
+ b
32
+ b
33
+ b
34
+ b
35
+ b
36
+ bbbbb
37
+ ```
38
+
39
+ **他に修正すべきだったところ**
27
- ついでにfuncのプロトタイプ宣言も足しました。
40
+ funcのプロトタイプ宣言の追加
41
+ ・文字配列の終端にヌル文字を追加
42
+ ・**func内でのstrの参照方法の変更**
43
+ ・ついでに文字列としても出力してみた
44
+
45
+ 特に三行目(**太字**)は要注意です。