回答編集履歴

2

サンプルコードのコンパイルエラーの修正

2016/10/26 03:54

投稿

majiponi
majiponi

スコア1720

test CHANGED
@@ -21,6 +21,8 @@
21
21
  ```C
22
22
 
23
23
  #include <stdio.h>
24
+
25
+ #include <string.h>
24
26
 
25
27
  #define MAXNUM 20
26
28
 

1

サンプルコードの追加

2016/10/26 03:54

投稿

majiponi
majiponi

スコア1720

test CHANGED
@@ -1,5 +1,155 @@
1
1
  mit0223さんのコメントに補足します。
2
2
 
3
- テストデータを拝見していないので推測の域を出ませんが、タブ文字にしたら実行時エラーが出た原因は、空白文字のときはエラーか表面化しなかっただけだと思います。
4
3
 
4
+
5
+ 「タブ文字にしたからエラーが出た」「空白文字だからエラーが出ない」
6
+
7
+ 起きた内容は左であって、右ではありません。
8
+
9
+
10
+
5
- テストデータに、「空白文字が含まれた名前人」はいませんか? 空白文字が含まれていたため、偶然、領域外をアクセスしなかっただと思います。
11
+ テストデータを拝見していないで推測の域を出ませんが、空白文字のときはバグ偶然」表面化しなかっただけで、バグがないわけではないと思います。
12
+
13
+ 例えば「空白文字が含まれた長い名前の人」はいませんか?
14
+
15
+ もしいれば、区切りが空白文字だったからオーバーランしてないように見えただけかもしれません。
16
+
17
+
18
+
19
+ 蛇足ですが、私が書くとこうなります。
20
+
21
+ ```C
22
+
23
+ #include <stdio.h>
24
+
25
+ #define MAXNUM 20
26
+
27
+ #define MAXLEN 31
28
+
29
+
30
+
31
+ int main(int argc, char *argv[])
32
+
33
+ {
34
+
35
+ FILE *sfp, *dfp;
36
+
37
+
38
+
39
+ char names[MAXNUM][MAXLEN+1];
40
+
41
+ int score[MAXNUM];
42
+
43
+ int n;
44
+
45
+
46
+
47
+ int i, j, k, m, t;
48
+
49
+ char buf[MAXLEN+1];
50
+
51
+ char fmt[63];
52
+
53
+ char del = '\t';
54
+
55
+
56
+
57
+ if (argc < 3) {
58
+
59
+ printf("missing file argument\n");
60
+
61
+ return 1;
62
+
63
+ }
64
+
65
+
66
+
67
+ if ((sfp = fopen(argv[1], "r")) == NULL) {
68
+
69
+ printf("can't open %s\n", argv[1]);
70
+
71
+ return 1;
72
+
73
+ }
74
+
75
+ if ((dfp = fopen(argv[2], "w")) == NULL) {
76
+
77
+ printf("can't open %s\n", argv[2]);
78
+
79
+ fclose(sfp);
80
+
81
+ return 1;
82
+
83
+ }
84
+
85
+
86
+
87
+ sprintf(fmt, "%%%d[^%c]%%*[^%c]%c%%d\n", MAXLEN, del, del, del);
88
+
89
+ // prepare format string to truncate long names
90
+
91
+
92
+
93
+ for (n = 0; n < MAXNUM; n++) {
94
+
95
+ if (fscanf(sfp, fmt, names[n], &score[n]) < 2) break;
96
+
97
+ }
98
+
99
+
100
+
101
+ // sort
102
+
103
+ for (i = 0; i < n-1; i++) {
104
+
105
+ min = score[i];
106
+
107
+ k = i;
108
+
109
+ for (j = i+1; j < n; j++) {
110
+
111
+ if (min > score[j]) {
112
+
113
+ min = score[j];
114
+
115
+ k = j;
116
+
117
+ }
118
+
119
+ }
120
+
121
+ t = score[i];
122
+
123
+ score[i] = score[k];
124
+
125
+ score[k] = t;
126
+
127
+ strcpy(buf, names[i]);
128
+
129
+ strcpy(names[i], names[k]);
130
+
131
+ strcpy(names[k], buf);
132
+
133
+ }
134
+
135
+
136
+
137
+ for(i = 0; i < n; i++){
138
+
139
+ fprintf(dfp, "%s%c%d\n", names[i], del, score[i]);
140
+
141
+ }
142
+
143
+
144
+
145
+ fclose(dfp);
146
+
147
+ fclose(sfp);
148
+
149
+ return 0;
150
+
151
+ }
152
+
153
+ ```
154
+
155
+