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

回答編集履歴

2

chop2\(\) を変更

2016/04/24 08:13

投稿

katoy
katoy

スコア22328

answer CHANGED
@@ -19,13 +19,24 @@
19
19
  }
20
20
 
21
21
  void chop2(char *p) {
22
- int len = strlen(p);
23
- for (int i = 0; i < len; i++) {
22
+ for (char * t = p + strlen(p) - 1; p <= t; t--) {
24
- if (p[i] == '\r' || p[i] == '\n') {
23
+ if (*t == '\r' || *t == '\n') {
25
- p[i] = 0;
24
+ *t = 0;
25
+ } else {
26
+ return;
26
27
  }
27
28
  }
28
29
  }
30
+
31
+ //void chop2(char *p) {
32
+ // int len = strlen(p);
33
+ // for (int i = 0; i < len; i++) {
34
+ // if (p[i] == '\r' || p[i] == '\n') {
35
+ // p[i] = 0;
36
+ // }
37
+ // }
38
+ //}
39
+
29
40
  void dump(char * p, int len) {
30
41
  for (int i = 0; i < len; i++) {
31
42
  printf(" %02X", *p & 0xff);
@@ -33,22 +44,32 @@
33
44
  }
34
45
  printf("\n");
35
46
  }
47
+
36
48
  int main(int atgc, char** argv) {
37
49
  char str[10];
38
50
 
51
+ printf("--- chop1\n");
39
- strcpy(str, "0\n");
52
+ strcpy(str, "0\n\n");
40
53
  printf("[%s]\n", str);
41
- chop(&str[2]);
54
+ chop(&str[3]);
42
55
  printf("[%s]\n", str);
43
56
  dump(str, sizeof(str));
44
57
 
45
- printf("\n");
58
+ printf("--- chop2\n");
46
- strcpy(str, "0\n");
59
+ strcpy(str, "0\n\n");
47
60
  printf("[%s]\n", str);
48
- chop2(&str[2]);
61
+ chop2(&str[3]);
49
62
  printf("[%s]\n", str);
50
63
  dump(str, sizeof(str));
51
64
 
65
+ printf("\n");
66
+
67
+ strcpy(str, "1\n2\n");
68
+ chop(str);
69
+ printf("chop\n[%s]\n", str);
70
+ strcpy(str, "1\n2\n");
71
+ chop2(str);
72
+ printf("chop2\n[%s]\n", str);
52
73
  return 0;
53
74
  }
54
75
  ```
@@ -57,24 +78,39 @@
57
78
  $ gcc x.c
58
79
 
59
80
  $ ./a.out
81
+ --- chop1
60
82
  [0
83
+
61
84
  ]
62
85
  [0]
63
- 30 00 00 58 9D 55 FF 7F 00 00
86
+ 30 00 00 00 B5 57 FF 7F 00 00
87
+ --- chop2
88
+ [0
64
89
 
65
- [0
66
90
  ]
67
91
  [0
92
+
68
93
  ]
69
- 30 0A 00 58 9D 55 FF 7F 00 00
94
+ 30 0A 0A 00 B5 57 FF 7F 00 00
95
+
96
+ chop
97
+ [1
98
+ 2]
99
+ chop2
100
+ [1
101
+ 2]
70
102
  ```
71
103
 
72
- chop には &str[2] を渡しているので、str[0], str[1] の内容が書き換わってはいけないです。
104
+ chop には &str[3] を渡しているので、str[0], str[1], str[2] の内容が書き換わってはいけないです。
73
105
  chop を呼んだ後は 30 00 00 ... となってます。
74
- chop2 を呼んだ後は 30 0A 00 ... となってます。
106
+ chop2 を呼んだ後は 30 0A 0A ... となってます。
75
- str[1] は 0A のままであるべきです。
107
+ str[1], str[2] は 0A, 0A のままであるべきです。
76
108
 
77
109
  chap(p) では、 0 をさがした後、 p-- しています。
78
110
  これが p の領域の外になってしまうことがあるわけです。
79
111
  そしてそこから p-- しながら \n, \r を探して 0 への置き換えをしているので...
80
- chap2(p) では、 p の領域外へのアクセスが発生しないようにしています。
112
+ chap2(p) では、 p の領域外へのアクセスが発生しないようにしています。
113
+
114
+ 変更: 2016-04-24 17:10
115
+ 変更前は, 文字列の途中に改行がふくまれている場合、 chop2() の挙動が chop() と異なっていました。
116
+ chop2()の挙動が chop() と同じになるようにしました。

1

誤字

2016/04/24 08:13

投稿

katoy
katoy

スコア22328

answer CHANGED
@@ -70,8 +70,8 @@
70
70
  ```
71
71
 
72
72
  chop には &str[2] を渡しているので、str[0], str[1] の内容が書き換わってはいけないです。
73
- chop をんだ後は 30 00 00 ... となってます。
73
+ chop をんだ後は 30 00 00 ... となってます。
74
- chop2 をんだ後は 30 0A 00 ... となってます。
74
+ chop2 をんだ後は 30 0A 00 ... となってます。
75
75
  str[1] は 0A のままであるべきです。
76
76
 
77
77
  chap(p) では、 0 をさがした後、 p-- しています。