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

回答編集履歴

4

バグの修正

2019/06/20 12:27

投稿

majiponi
majiponi

スコア1722

answer CHANGED
@@ -38,20 +38,20 @@
38
38
  char dest[BUFSIZE];
39
39
  int i;
40
40
 
41
- buf.head = buf.tail = 0;
41
+ buf.head = buf.tail = 0;
42
42
  for(i = 0; i < BUFSIZE; i++){
43
43
  buf.store[i] = '\0';
44
44
  }
45
45
 
46
- put_str(&buf, "ten");
46
+ put_str(&buf, "ten");
47
47
  put_str(&buf, "six");
48
48
  put_str(&buf, "three");
49
49
  put_str(&buf, "four");
50
50
 
51
- get_str(&buf, &dest);
51
+ get_str(&buf, &dest, sizeof(dest) / sizeof(dest[0]));
52
52
  puts(dest);
53
53
 
54
- return 0;
54
+ return 0;
55
55
  }
56
56
  ```
57
57
  携帯から打っているのでミスがあるかもしれませんが、こんな感じです。

3

バグの修正

2019/06/20 12:27

投稿

majiponi
majiponi

スコア1722

answer CHANGED
@@ -24,10 +24,12 @@
24
24
  if(buf->head == buf->tail) return 0;
25
25
  if(size == 0) return 0;
26
26
  for(size--; size > 0 && buf->store[buf->head % BUFSIZE]; size--){
27
- *dest++ = buf->store[buf->head % BUFSIZE];
27
+ *dest++ = buf->store[buf->head++ % BUFSIZE];
28
28
  }
29
29
  *dest = '\0';
30
- return buf->store[buf->head % BUFSIZE];
30
+ if(buf->store[buf->head % BUFSIZE]) return 0;
31
+ buf->head++;
32
+ return 1;
31
33
  }
32
34
 
33
35
 

2

コード例の追記

2019/06/20 12:25

投稿

majiponi
majiponi

スコア1722

answer CHANGED
@@ -6,4 +6,50 @@
6
6
  ポインタを更新せず、同じ領域を上書きしている。
7
7
 
8
8
  問題点3
9
- get_str内部の「割り算」の意味は?
9
+ get_str内部の「割り算」の意味は?
10
+
11
+ 追記:私が書く場合
12
+ ```C
13
+ int put_str(struct buffer *buf, const char *str) {
14
+ int i, nFree = BUFSIZE - (buf->tail - buf->head);
15
+ if(nFree == 0) return 0;
16
+ for(nFree--; nFree > 0 && *str; nFree--){
17
+ buf->store[buf->tail++ % BUFSIZE] = *str++;
18
+ }
19
+ buf->store[buf->tail++ % BUFSIZE] = '\0';
20
+ return !*str;
21
+ }
22
+
23
+ int get_str(struct buffer *buf, char *dest, int size) {
24
+ if(buf->head == buf->tail) return 0;
25
+ if(size == 0) return 0;
26
+ for(size--; size > 0 && buf->store[buf->head % BUFSIZE]; size--){
27
+ *dest++ = buf->store[buf->head % BUFSIZE];
28
+ }
29
+ *dest = '\0';
30
+ return buf->store[buf->head % BUFSIZE];
31
+ }
32
+
33
+
34
+ int main() {
35
+ struct buffer buf;
36
+ char dest[BUFSIZE];
37
+ int i;
38
+
39
+ buf.head = buf.tail = 0;
40
+ for(i = 0; i < BUFSIZE; i++){
41
+ buf.store[i] = '\0';
42
+ }
43
+
44
+ put_str(&buf, "ten");
45
+ put_str(&buf, "six");
46
+ put_str(&buf, "three");
47
+ put_str(&buf, "four");
48
+
49
+ get_str(&buf, &dest);
50
+ puts(dest);
51
+
52
+ return 0;
53
+ }
54
+ ```
55
+ 携帯から打っているのでミスがあるかもしれませんが、こんな感じです。

1

改訂

2019/06/20 12:20

投稿

majiponi
majiponi

スコア1722

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