回答編集履歴

2

chop2\(\) を変更

2016/04/24 08:13

投稿

katoy
katoy

スコア22324

test CHANGED
@@ -40,45 +40,71 @@
40
40
 
41
41
  void chop2(char *p) {
42
42
 
43
+ for (char * t = p + strlen(p) - 1; p <= t; t--) {
44
+
45
+ if (*t == '\r' || *t == '\n') {
46
+
47
+ *t = 0;
48
+
49
+ } else {
50
+
51
+ return;
52
+
53
+ }
54
+
55
+ }
56
+
57
+ }
58
+
59
+
60
+
61
+ //void chop2(char *p) {
62
+
43
- int len = strlen(p);
63
+ // int len = strlen(p);
64
+
65
+ // for (int i = 0; i < len; i++) {
66
+
67
+ // if (p[i] == '\r' || p[i] == '\n') {
68
+
69
+ // p[i] = 0;
70
+
71
+ // }
72
+
73
+ // }
74
+
75
+ //}
76
+
77
+
78
+
79
+ void dump(char * p, int len) {
44
80
 
45
81
  for (int i = 0; i < len; i++) {
46
82
 
47
- if (p[i] == '\r' || p[i] == '\n') {
83
+ printf(" %02X", *p & 0xff);
48
-
84
+
49
- p[i] = 0;
85
+ p++;
50
-
51
- }
52
86
 
53
87
  }
54
88
 
55
- }
56
-
57
- void dump(char * p, int len) {
58
-
59
- for (int i = 0; i < len; i++) {
60
-
61
- printf(" %02X", *p & 0xff);
62
-
63
- p++;
64
-
65
- }
66
-
67
89
  printf("\n");
68
90
 
69
91
  }
70
92
 
93
+
94
+
71
95
  int main(int atgc, char** argv) {
72
96
 
73
97
  char str[10];
74
98
 
75
99
 
76
100
 
101
+ printf("--- chop1\n");
102
+
77
- strcpy(str, "0\n");
103
+ strcpy(str, "0\n\n");
78
-
104
+
79
- printf("[%s]\n", str);
105
+ printf("[%s]\n", str);
80
-
106
+
81
- chop(&str[2]);
107
+ chop(&str[3]);
82
108
 
83
109
  printf("[%s]\n", str);
84
110
 
@@ -86,19 +112,35 @@
86
112
 
87
113
 
88
114
 
115
+ printf("--- chop2\n");
116
+
117
+ strcpy(str, "0\n\n");
118
+
119
+ printf("[%s]\n", str);
120
+
121
+ chop2(&str[3]);
122
+
123
+ printf("[%s]\n", str);
124
+
125
+ dump(str, sizeof(str));
126
+
127
+
128
+
89
129
  printf("\n");
90
130
 
131
+
132
+
91
- strcpy(str, "0\n");
133
+ strcpy(str, "1\n2\n");
134
+
92
-
135
+ chop(str);
136
+
93
- printf("[%s]\n", str);
137
+ printf("chop\n[%s]\n", str);
138
+
94
-
139
+ strcpy(str, "1\n2\n");
140
+
95
- chop2(&str[2]);
141
+ chop2(str);
96
-
142
+
97
- printf("[%s]\n", str);
143
+ printf("chop2\n[%s]\n", str);
98
-
99
- dump(str, sizeof(str));
100
-
101
-
102
144
 
103
145
  return 0;
104
146
 
@@ -116,37 +158,59 @@
116
158
 
117
159
  $ ./a.out
118
160
 
161
+ --- chop1
162
+
119
163
  [0
120
164
 
165
+
166
+
121
167
  ]
122
168
 
123
169
  [0]
124
170
 
125
- 30 00 00 58 9D 55 FF 7F 00 00
171
+ 30 00 00 00 B5 57 FF 7F 00 00
172
+
126
-
173
+ --- chop2
127
-
128
174
 
129
175
  [0
130
176
 
177
+
178
+
131
179
  ]
132
180
 
133
181
  [0
134
182
 
183
+
184
+
135
185
  ]
136
186
 
137
- 30 0A 00 58 9D 55 FF 7F 00 00
187
+ 30 0A 0A 00 B5 57 FF 7F 00 00
188
+
189
+
190
+
191
+ chop
192
+
193
+ [1
194
+
195
+ 2]
196
+
197
+ chop2
198
+
199
+ [1
200
+
201
+ 2]
138
202
 
139
203
  ```
140
204
 
141
205
 
142
206
 
143
- chop には &str[2] を渡しているので、str[0], str[1] の内容が書き換わってはいけないです。
207
+ chop には &str[3] を渡しているので、str[0], str[1], str[2] の内容が書き換わってはいけないです。
144
208
 
145
209
  chop を呼んだ後は 30 00 00 ... となってます。
146
210
 
147
- chop2 を呼んだ後は 30 0A 00 ... となってます。
211
+ chop2 を呼んだ後は 30 0A 0A ... となってます。
148
-
212
+
149
- str[1] は 0A のままであるべきです。
213
+ str[1], str[2] は 0A, 0A のままであるべきです。
150
214
 
151
215
 
152
216
 
@@ -157,3 +221,11 @@
157
221
  そしてそこから p-- しながら \n, \r を探して 0 への置き換えをしているので...
158
222
 
159
223
  chap2(p) では、 p の領域外へのアクセスが発生しないようにしています。
224
+
225
+
226
+
227
+ 変更: 2016-04-24 17:10
228
+
229
+ 変更前は, 文字列の途中に改行がふくまれている場合、 chop2() の挙動が chop() と異なっていました。
230
+
231
+ chop2()の挙動が chop() と同じになるようにしました。

1

誤字

2016/04/24 08:13

投稿

katoy
katoy

スコア22324

test CHANGED
@@ -142,9 +142,9 @@
142
142
 
143
143
  chop には &str[2] を渡しているので、str[0], str[1] の内容が書き換わってはいけないです。
144
144
 
145
- chop をんだ後は 30 00 00 ... となってます。
145
+ chop をんだ後は 30 00 00 ... となってます。
146
146
 
147
- chop2 をんだ後は 30 0A 00 ... となってます。
147
+ chop2 をんだ後は 30 0A 00 ... となってます。
148
148
 
149
149
  str[1] は 0A のままであるべきです。
150
150