回答編集履歴

14

修正

2019/01/14 06:29

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -90,7 +90,7 @@
90
90
 
91
91
  // ・EOF (-1) が返されるまでの間は読み続ける
92
92
 
93
- for (int r; (r = scanf("%255[^\n;]%*[^\n;]", buffer)) != EOF; scanf("%*c")) {
93
+ for (int r; (r = scanf("%255[^\r\n;]%*[^\r\n;]", buffer)) != EOF; scanf("%*c")) {
94
94
 
95
95
 
96
96
 
@@ -112,7 +112,7 @@
112
112
 
113
113
  // 余分な文字を削ぎ落として出力
114
114
 
115
- for (char *t = strtok(buffer, "\r\n "); t != NULL; t = strtok(NULL, "\r\n ")) {
115
+ for (char *t = strtok(buffer, "\t "); t != NULL; t = strtok(NULL, "\t ")) {
116
116
 
117
117
  skip = 0;
118
118
 

13

追記

2019/01/14 06:29

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -18,34 +18,124 @@
18
18
 
19
19
  {
20
20
 
21
- // 255バイト+NULLバイトのスペースを確保
21
+ // 255バイト+NULLバイトのスペースを確保
22
22
 
23
- char buffer[256];
23
+ char buffer[256];
24
24
 
25
25
 
26
26
 
27
- // ・255バイト以内で区切り文字以外を連続するだけ読み取る
27
+ // ・255バイト以内で区切り文字以外を連続するだけ読み取る
28
28
 
29
- // ・255バイトを超えた部分や区切り文字自身は読み捨てる
29
+ // ・255バイトを超えた部分や区切り文字自身は読み捨てる
30
30
 
31
- // ・EOF (-1) が返されるまでの間は読み続ける
31
+ // ・EOF (-1) が返されるまでの間は読み続ける
32
32
 
33
- for (int r; (r = scanf("%255[^\r\n\t ;]%*[^\r\n\t ;]", buffer)) != EOF; scanf("%*c")) {
33
+ for (int r; (r = scanf("%255[^\r\n\t ;]%*[^\r\n\t ;]", buffer)) != EOF; scanf("%*c")) {
34
-
35
- // 読み込めた場合のみ r=1 になっている
36
-
37
- if (r > 0) {
38
-
39
- puts(buffer);
40
-
41
- }
42
-
43
- }
44
34
 
45
35
 
46
36
 
37
+ // 読み込めた場合のみ r=1 になっている
38
+
39
+ if (r > 0) {
40
+
41
+ puts(buffer);
42
+
43
+ }
44
+
45
+ }
46
+
47
+
48
+
47
- return 0;
49
+ return 0;
48
50
 
49
51
  }
50
52
 
51
53
  ```
54
+
55
+
56
+
57
+ ----
58
+
59
+
60
+
61
+ 【補足】
62
+
63
+
64
+
65
+ もし `z = 3` のような式の間に半角スペースが入ってくる場合には `strtok` も絡めてもうひと工夫必要ですね。
66
+
67
+
68
+
69
+ ```c
70
+
71
+ #include <stdio.h>
72
+
73
+ #include <string.h>
74
+
75
+
76
+
77
+ int main(void)
78
+
79
+ {
80
+
81
+ // 255バイト+NULLバイトのスペースを確保
82
+
83
+ char buffer[256];
84
+
85
+
86
+
87
+ // ・255バイト以内で区切り文字以外を連続するだけ読み取る
88
+
89
+ // ・255バイトを超えた部分や区切り文字自身は読み捨てる
90
+
91
+ // ・EOF (-1) が返されるまでの間は読み続ける
92
+
93
+ for (int r; (r = scanf("%255[^\n;]%*[^\n;]", buffer)) != EOF; scanf("%*c")) {
94
+
95
+
96
+
97
+ // 読み込めた場合のみ r=1 になっている
98
+
99
+ if (r < 1) {
100
+
101
+ continue;
102
+
103
+ }
104
+
105
+
106
+
107
+ // 空行判定用変数
108
+
109
+ int skip = 1;
110
+
111
+
112
+
113
+ // 余分な文字を削ぎ落として出力
114
+
115
+ for (char *t = strtok(buffer, "\r\n "); t != NULL; t = strtok(NULL, "\r\n ")) {
116
+
117
+ skip = 0;
118
+
119
+ printf("%s", t);
120
+
121
+ }
122
+
123
+
124
+
125
+ // 空行ではなければ改行コードを出力
126
+
127
+ if (!skip) {
128
+
129
+ putchar('\n');
130
+
131
+ }
132
+
133
+ }
134
+
135
+
136
+
137
+ return 0;
138
+
139
+ }
140
+
141
+ ```

12

修正

2019/01/14 05:51

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -24,15 +24,13 @@
24
24
 
25
25
 
26
26
 
27
- // ・255バイト以内で「\r」「\n」「\t」「半角スペース」「;」以外の文字を連続するだけ読み取る
27
+ // ・255バイト以内で区切り文字以外を連続するだけ読み取る
28
28
 
29
- // ・255バイトを超えてる長い文字超えたぶんだけ読み捨てる
29
+ // ・255バイトを超えた部分や区切り文字自身は読み捨てる
30
-
31
- // ・ループの終わりに残っている「\r」「\n」「\t」「半角スペース」「;」を読み飛ばす
32
30
 
33
31
  // ・EOF (-1) が返されるまでの間は読み続ける
34
32
 
35
- for (int r; (r = scanf("%255[^\r\n\t ;]%*[^\r\n\t ;]", buffer)) != EOF; scanf("%*[\r\n\t ;]")) {
33
+ for (int r; (r = scanf("%255[^\r\n\t ;]%*[^\r\n\t ;]", buffer)) != EOF; scanf("%*c")) {
36
34
 
37
35
  // 読み込めた場合のみ r=1 になっている
38
36
 

11

修正

2019/01/14 04:54

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -1,6 +1,10 @@
1
1
  `fscanf` の書式を使って空白文字列の他に `;` も無視するように設定するとラクだと思います!
2
2
 
3
3
  (サンプルは `scanf` を使って標準入力→標準出力の流れにしておきます)
4
+
5
+
6
+
7
+ 備考: [標準入力から安全に文字列を受け取る方法いろいろ - Qiita](https://qiita.com/mpyw/items/aff12a6ff2c7726ed1d8#scanf%E3%81%AE%E5%88%A9%E7%94%A8)
4
8
 
5
9
 
6
10
 
@@ -20,13 +24,15 @@
20
24
 
21
25
 
22
26
 
23
- // 255バイト以内で「\r」「\n」「\t」「半角スペース」「;」以外の文字を連続するだけ読み取る
27
+ // 255バイト以内で「\r」「\n」「\t」「半角スペース」「;」以外の文字を連続するだけ読み取る
24
28
 
25
- // ループの終わりに残っている「\r」「\n」「\t」「半角スペース」「;」を読み飛ばす
29
+ // ・255バイトを超える長文字列は超えたぶんだけ読み捨てる
26
30
 
27
- // EOF (-1) が返されまでの間は読み続ける
31
+ // ・ループの終わりに残ってい「\r」「\n」「\t」「半角スペース」「;」を読み飛ばす
28
32
 
33
+ // ・EOF (-1) が返されるまでの間は読み続ける
34
+
29
- for (int r; (r = scanf("%255[^\r\n\t ;]", buffer)) != EOF; scanf("%*[\r\n\t ;]")) {
35
+ for (int r; (r = scanf("%255[^\r\n\t ;]%*[^\r\n\t ;]", buffer)) != EOF; scanf("%*[\r\n\t ;]")) {
30
36
 
31
37
  // 読み込めた場合のみ r=1 になっている
32
38
 

10

コメント

2019/01/14 04:52

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -14,11 +14,21 @@
14
14
 
15
15
  {
16
16
 
17
+ // 255バイト+NULLバイトのスペースを確保
18
+
17
19
  char buffer[256];
18
20
 
19
21
 
20
22
 
23
+ // 255バイト以内で「\r」「\n」「\t」「半角スペース」「;」以外の文字を連続するだけ読み取る
24
+
25
+ // ループの終わりに残っている「\r」「\n」「\t」「半角スペース」「;」を読み飛ばす
26
+
27
+ // EOF (-1) が返されるまでの間は読み続ける
28
+
21
29
  for (int r; (r = scanf("%255[^\r\n\t ;]", buffer)) != EOF; scanf("%*[\r\n\t ;]")) {
30
+
31
+ // 読み込めた場合のみ r=1 になっている
22
32
 
23
33
  if (r > 0) {
24
34
 

9

修正

2019/01/14 04:41

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -1,8 +1,6 @@
1
- [標準入力から安全に文字列を受け取る方法いろいろ - Qiita](https://qiita.com/mpyw/items/aff12a6ff2c7726ed1d8#scanf%E3%81%AE%E5%88%A9%E7%94%A8)
1
+ `fscanf` の書式を使って空白文字列の他に `;` も無視するように設定するとラクだと思います!
2
2
 
3
- これをベースに `scanf` の代わりに `fscanf` でやるのがラクかも?
4
-
5
- (サンプルは標準入力→標準出力の流れにしておきます)
3
+ (サンプルは `scanf` を使って標準入力→標準出力の流れにしておきます)
6
4
 
7
5
 
8
6
 
@@ -16,13 +14,11 @@
16
14
 
17
15
  {
18
16
 
19
- const char *format = "%255[^\r\n\t ;]";
20
-
21
17
  char buffer[256];
22
18
 
23
19
 
24
20
 
25
- for (int r; (r = scanf(format, buffer)) != EOF; scanf("%*[\r\n\t ;]")) {
21
+ for (int r; (r = scanf("%255[^\r\n\t ;]", buffer)) != EOF; scanf("%*[\r\n\t ;]")) {
26
22
 
27
23
  if (r > 0) {
28
24
 

8

修正

2019/01/14 04:34

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -16,13 +16,13 @@
16
16
 
17
17
  {
18
18
 
19
- const char *format = "%255[^\r\n\t ;]%*[\r\n\t ;]";
19
+ const char *format = "%255[^\r\n\t ;]";
20
20
 
21
21
  char buffer[256];
22
22
 
23
23
 
24
24
 
25
- for (int r; (r = scanf(format, buffer)) != EOF; scanf("%*c")) {
25
+ for (int r; (r = scanf(format, buffer)) != EOF; scanf("%*[\r\n\t ;]")) {
26
26
 
27
27
  if (r > 0) {
28
28
 

7

修正

2019/01/14 04:33

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -1,6 +1,8 @@
1
- `fscanf` を使いましょう!
1
+ [標準入力から安全に文字列を受け取る方法いろいろ - Qiita](https://qiita.com/mpyw/items/aff12a6ff2c7726ed1d8#scanf%E3%81%AE%E5%88%A9%E7%94%A8)
2
2
 
3
+ これをベースに `scanf` の代わりに `fscanf` でやるのがラクかも?
4
+
3
- (サンプルは標準入出力を使うため代わり `scanf` にしておきます)
5
+ (サンプルは標準入力→標準出力の流れにしておきます)
4
6
 
5
7
 
6
8
 
@@ -14,23 +16,25 @@
14
16
 
15
17
  {
16
18
 
19
+ const char *format = "%255[^\r\n\t ;]%*[\r\n\t ;]";
20
+
17
- char buffer[256];
21
+ char buffer[256];
18
22
 
19
23
 
20
24
 
21
- for (int r; (r = scanf("%255[^\r\n\t ;]", buffer)) != EOF; scanf("%*c")) {
25
+ for (int r; (r = scanf(format, buffer)) != EOF; scanf("%*c")) {
22
26
 
23
- if (r > 0) {
27
+ if (r > 0) {
24
28
 
25
- puts(buffer);
29
+ puts(buffer);
26
30
 
27
- }
31
+ }
28
32
 
29
- }
33
+ }
30
34
 
31
35
 
32
36
 
33
- return 0;
37
+ return 0;
34
38
 
35
39
  }
36
40
 

6

コメント

2019/01/14 04:31

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -1,10 +1,6 @@
1
- [標準入力から安全に文字列を受け取る方法いろいろ - Qiita](https://qiita.com/mpyw/items/aff12a6ff2c7726ed1d8#scanf%E3%81%AE%E5%88%A9%E7%94%A8)
1
+ `fscanf` を使いましょう!
2
2
 
3
-
4
-
5
- これをベースに `scanf` の代わりに `fscanf` でやるのがラクかも?
6
-
7
- (サンプルは標準入力→標準出力の流れにしておきます)
3
+ (サンプルは標準入出力を使うため代わり `scanf` にしておきます)
8
4
 
9
5
 
10
6
 
@@ -18,13 +14,11 @@
18
14
 
19
15
  {
20
16
 
21
- const char *format = "%255[^\r\n\t ;]%*[^\r\n\t ;]";
22
-
23
17
  char buffer[256];
24
18
 
25
19
 
26
20
 
27
- for (int r; (r = scanf(format, buffer)) != EOF; scanf("%*c")) {
21
+ for (int r; (r = scanf("%255[^\r\n\t ;]", buffer)) != EOF; scanf("%*c")) {
28
22
 
29
23
  if (r > 0) {
30
24
 

5

修正

2019/01/14 04:29

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- for (int r; (r = scanf(format, buffer, &length)) != EOF; scanf("%*c")) {
27
+ for (int r; (r = scanf(format, buffer)) != EOF; scanf("%*c")) {
28
28
 
29
29
  if (r > 0) {
30
30
 

4

修正

2019/01/14 04:19

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -18,17 +18,17 @@
18
18
 
19
19
  {
20
20
 
21
+ const char *format = "%255[^\r\n\t ;]%*[^\r\n\t ;]";
22
+
21
23
  char buffer[256];
22
-
23
- size_t length;
24
24
 
25
25
 
26
26
 
27
- for (; scanf("%255[^\r\n\t ;]%zn%*[^\r\n\t ;]", buffer, &length) != EOF; scanf("%*c")) {
27
+ for (int r; (r = scanf(format, buffer, &length)) != EOF; scanf("%*c")) {
28
28
 
29
- if (length > 0) {
29
+ if (r > 0) {
30
30
 
31
- puts(buffer);
31
+ puts(buffer);
32
32
 
33
33
  }
34
34
 

3

修正

2019/01/14 04:18

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- for (; scanf("%255[^\r\n\t ;]%zn%[^\r\n\t ;]*", buffer, &length) != EOF; scanf("%*c")) {
27
+ for (; scanf("%255[^\r\n\t ;]%zn%*[^\r\n\t ;]", buffer, &length) != EOF; scanf("%*c")) {
28
28
 
29
29
  if (length > 0) {
30
30
 

2

修正

2019/01/14 04:07

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- for (; scanf("%255[^\r\n\t ;]%zn%[^\r\n\t ;]*", buffer) != EOF; scanf("%*c")) {
27
+ for (; scanf("%255[^\r\n\t ;]%zn%[^\r\n\t ;]*", buffer, &length) != EOF; scanf("%*c")) {
28
28
 
29
29
  if (length > 0) {
30
30
 

1

修正

2019/01/14 04:06

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -20,11 +20,17 @@
20
20
 
21
21
  char buffer[256];
22
22
 
23
+ size_t length;
23
24
 
24
25
 
25
- for (; scanf("%255[^\r\n\t ;]%[^\r\n\t ;]*", buffer) != EOF; scanf("%*c")) {
26
26
 
27
+ for (; scanf("%255[^\r\n\t ;]%zn%[^\r\n\t ;]*", buffer) != EOF; scanf("%*c")) {
28
+
29
+ if (length > 0) {
30
+
27
- puts(buffer);
31
+ puts(buffer);
32
+
33
+ }
28
34
 
29
35
  }
30
36