回答編集履歴

4

バグの修正

2019/06/20 12:27

投稿

majiponi
majiponi

スコア1720

test CHANGED
@@ -78,7 +78,7 @@
78
78
 
79
79
 
80
80
 
81
- buf.head = buf.tail = 0;
81
+ buf.head = buf.tail = 0;
82
82
 
83
83
  for(i = 0; i < BUFSIZE; i++){
84
84
 
@@ -88,7 +88,7 @@
88
88
 
89
89
 
90
90
 
91
- put_str(&buf, "ten");
91
+ put_str(&buf, "ten");
92
92
 
93
93
  put_str(&buf, "six");
94
94
 
@@ -98,13 +98,13 @@
98
98
 
99
99
 
100
100
 
101
- get_str(&buf, &dest);
101
+ get_str(&buf, &dest, sizeof(dest) / sizeof(dest[0]));
102
102
 
103
103
  puts(dest);
104
104
 
105
105
 
106
106
 
107
- return 0;
107
+ return 0;
108
108
 
109
109
  }
110
110
 

3

バグの修正

2019/06/20 12:27

投稿

majiponi
majiponi

スコア1720

test CHANGED
@@ -50,13 +50,17 @@
50
50
 
51
51
  for(size--; size > 0 && buf->store[buf->head % BUFSIZE]; size--){
52
52
 
53
- *dest++ = buf->store[buf->head % BUFSIZE];
53
+ *dest++ = buf->store[buf->head++ % BUFSIZE];
54
54
 
55
55
  }
56
56
 
57
57
  *dest = '\0';
58
58
 
59
- return buf->store[buf->head % BUFSIZE];
59
+ if(buf->store[buf->head % BUFSIZE]) return 0;
60
+
61
+ buf->head++;
62
+
63
+ return 1;
60
64
 
61
65
  }
62
66
 

2

コード例の追記

2019/06/20 12:25

投稿

majiponi
majiponi

スコア1720

test CHANGED
@@ -15,3 +15,95 @@
15
15
  問題点3
16
16
 
17
17
  get_str内部の「割り算」の意味は?
18
+
19
+
20
+
21
+ 追記:私が書く場合
22
+
23
+ ```C
24
+
25
+ int put_str(struct buffer *buf, const char *str) {
26
+
27
+ int i, nFree = BUFSIZE - (buf->tail - buf->head);
28
+
29
+ if(nFree == 0) return 0;
30
+
31
+ for(nFree--; nFree > 0 && *str; nFree--){
32
+
33
+ buf->store[buf->tail++ % BUFSIZE] = *str++;
34
+
35
+ }
36
+
37
+ buf->store[buf->tail++ % BUFSIZE] = '\0';
38
+
39
+ return !*str;
40
+
41
+ }
42
+
43
+
44
+
45
+ int get_str(struct buffer *buf, char *dest, int size) {
46
+
47
+ if(buf->head == buf->tail) return 0;
48
+
49
+ if(size == 0) return 0;
50
+
51
+ for(size--; size > 0 && buf->store[buf->head % BUFSIZE]; size--){
52
+
53
+ *dest++ = buf->store[buf->head % BUFSIZE];
54
+
55
+ }
56
+
57
+ *dest = '\0';
58
+
59
+ return buf->store[buf->head % BUFSIZE];
60
+
61
+ }
62
+
63
+
64
+
65
+
66
+
67
+ int main() {
68
+
69
+ struct buffer buf;
70
+
71
+ char dest[BUFSIZE];
72
+
73
+ int i;
74
+
75
+
76
+
77
+ buf.head = buf.tail = 0;
78
+
79
+ for(i = 0; i < BUFSIZE; i++){
80
+
81
+ buf.store[i] = '\0';
82
+
83
+ }
84
+
85
+
86
+
87
+ put_str(&buf, "ten");
88
+
89
+ put_str(&buf, "six");
90
+
91
+ put_str(&buf, "three");
92
+
93
+ put_str(&buf, "four");
94
+
95
+
96
+
97
+ get_str(&buf, &dest);
98
+
99
+ puts(dest);
100
+
101
+
102
+
103
+ return 0;
104
+
105
+ }
106
+
107
+ ```
108
+
109
+ 携帯から打っているのでミスがあるかもしれませんが、こんな感じです。

1

改訂

2019/06/20 12:20

投稿

majiponi
majiponi

スコア1720

test CHANGED
@@ -1,7 +1,17 @@
1
- まず、get_str関数に渡す直前の構造体の中身をデバッガなり手計算で書き出してみてください。
1
+ 問題点1
2
2
 
3
- それから、関数内部での「割り算」の結果はいくつで、get_str関数に渡しているchar型の(配列でない)変数destには何格納されますか?
3
+ get_str関数で返したいのは文字列(charの配列)だが、関数に渡しているのはchar型の変数である。main関数内部のdestを受け取り用の配列する必要ある。
4
4
 
5
5
 
6
6
 
7
+ 問題点2
8
+
7
- …というの自分で考えみてください。問題点は複数あります。そのコメントを見てから解決案を提示します。
9
+ get_str関数が文字列返す仕様になっていない
10
+
11
+ ポインタを更新せず、同じ領域を上書きしている。
12
+
13
+
14
+
15
+ 問題点3
16
+
17
+ get_str内部の「割り算」の意味は?