回答編集履歴
2
chop2\(\) を変更
answer
CHANGED
@@ -19,13 +19,24 @@
|
|
19
19
|
}
|
20
20
|
|
21
21
|
void chop2(char *p) {
|
22
|
-
int len = strlen(p);
|
23
|
-
for (
|
22
|
+
for (char * t = p + strlen(p) - 1; p <= t; t--) {
|
24
|
-
if (
|
23
|
+
if (*t == '\r' || *t == '\n') {
|
25
|
-
|
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[
|
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[
|
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
|
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
|
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[
|
104
|
+
chop には &str[3] を渡しているので、str[0], str[1], str[2] の内容が書き換わってはいけないです。
|
73
105
|
chop を呼んだ後は 30 00 00 ... となってます。
|
74
|
-
chop2 を呼んだ後は 30 0A
|
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
誤字
answer
CHANGED
@@ -70,8 +70,8 @@
|
|
70
70
|
```
|
71
71
|
|
72
72
|
chop には &str[2] を渡しているので、str[0], str[1] の内容が書き換わってはいけないです。
|
73
|
-
chop を
|
73
|
+
chop を呼んだ後は 30 00 00 ... となってます。
|
74
|
-
chop2 を
|
74
|
+
chop2 を呼んだ後は 30 0A 00 ... となってます。
|
75
75
|
str[1] は 0A のままであるべきです。
|
76
76
|
|
77
77
|
chap(p) では、 0 をさがした後、 p-- しています。
|