回答編集履歴

8

コードコメント修正

2024/09/01 06:17

投稿

jimbe
jimbe

スコア13070

test CHANGED
@@ -57,7 +57,7 @@
57
57
  } else {
58
58
  *e = '\0'; //',' を '\0' に書き換え
59
59
  }
60
- printf("%s\n", p); //文字を表示
60
+ printf("%s\n", p); //文字を表示
61
61
  p = e + 1; //次の文字列の先頭
62
62
  }
63
63
  }

7

修正

2024/08/31 06:55

投稿

jimbe
jimbe

スコア13070

test CHANGED
@@ -3,7 +3,8 @@
3
3
 
4
4
  >いろいろ入れ替えたり()の中設定を変えたりしました
5
5
 
6
- プログラムはテキトウに弄って動けば良いというモノではありません。機械式時計の歯車のように全て意味が有り噛み合ってこそのプログラムであり、ただ正解が出れば良いと運に任せるようでは勉強する意味が無いでしょう。
6
+ プログラムはテキトウに弄って動けば良いというモノではありません。機械式時計の歯車のように全て意味が有り噛み合ってこそのプログラム/システムであり、ただ正解が出れば良いと運に任せるようでは勉強する意味が無いでしょう。
7
+ ついキツイことを言ってしまいますが、もしそのような考えでたまたま動いたプログラムが原子炉の制御システムや飛行機の航行システム・銀行等の基幹システムに入っていて問題が起きたら、運が悪かったでは済まされません。
7
8
 
8
9
  以下は strtok を使わない場合です。
9
10
  二行目の最大文字数(100)が入る配列に gets で読み込み、各文字毎に判断して文字の表示もしくは改行・処理終了を行います。読み込んだ全てを処理すれば良いので N を使う必要はありません。

6

コード追加

2024/08/31 06:46

投稿

jimbe
jimbe

スコア13070

test CHANGED
@@ -37,7 +37,30 @@
37
37
  bbbbbb
38
38
  cccc
39
39
  ```
40
+ strtok 的に書くと
41
+ ```c
42
+ #include <stdio.h>
40
43
 
44
+ int main(void){
45
+ char b[100+1]; //最大100文字+終端文字分
46
+
47
+ gets(b); //一行目取得
48
+ int N = atoi(b); //(取得したけども使わない)
49
+ gets(b); //二行目取得
50
+ char *p = b;
51
+ for(int last=0/*false*/; !last; ) { //最後の処理まで
52
+ char *e = p;
53
+ while(*e!=',' && *e!='\0') e++; //文字列の終わりを探す
54
+ if(*e == '\0') {
55
+ last = 1; //true: これが最後
56
+ } else {
57
+ *e = '\0'; //',' を '\0' に書き換え
58
+ }
59
+ printf("%s\n", p); //文字を表示
60
+ p = e + 1; //次の文字列の先頭
61
+ }
62
+ }
63
+ ```
41
64
  strtok を使うなら以下のようになります。
42
65
  for ループ内に埋め込んでいますが、最初は第一引数に文字列の先頭を指定し、ループ二回目以降は NULL とします。
43
66
  ```c
@@ -69,7 +92,7 @@
69
92
  char *p = strtok(b, ","); //最初の文字列を取得
70
93
  while(p != NULL) { //文字列が取得できている間ループ
71
94
  printf("%s\n", p); //文字列を表示
72
- p = strtok(NULL,","); //次の文字列を取得
95
+ p = strtok(NULL, ","); //次の文字列を取得
73
96
  }
74
97
  }
75
98
  ```

5

コード追加

2024/08/31 06:15

投稿

jimbe
jimbe

スコア13070

test CHANGED
@@ -50,8 +50,26 @@
50
50
  gets(b); //一行目取得
51
51
  int N = atoi(b); //(取得したけども使わない)
52
52
  gets(b); //二行目取得
53
- for(char *p=strtok(b, ","); p!=NULL; p=strtok(NULL,",")) { //文字列毎にループ
53
+ for(char *p=strtok(b, ","); p!=NULL; p=strtok(NULL,",")) { //文字列が取得できている間ループ
54
54
  printf("%s\n", p); //文字列を表示
55
55
  }
56
56
  }
57
57
  ```
58
+ for を while に変えるとこんな感じに。
59
+ ```c
60
+ #include <stdio.h>
61
+ #include <string.h>
62
+
63
+ int main(void){
64
+ char b[100+1]; //最大100文字+終端文字分
65
+
66
+ gets(b); //一行目取得
67
+ int N = atoi(b); //(取得したけども使わない)
68
+ gets(b); //二行目取得
69
+ char *p = strtok(b, ","); //最初の文字列を取得
70
+ while(p != NULL) { //文字列が取得できている間ループ
71
+ printf("%s\n", p); //文字列を表示
72
+ p = strtok(NULL,","); //次の文字列を取得
73
+ }
74
+ }
75
+ ```

4

追記

2024/08/31 05:09

投稿

jimbe
jimbe

スコア13070

test CHANGED
@@ -1,5 +1,9 @@
1
1
  何時どのような形で何を標準入力から取得し、何をループして何をするのか・・・つまり全体的な入出力の設計が出来ていません。 strtok うんぬんは末端のことで、それ以前の問題です。
2
2
  strtok を使うよう指示があるわけでもありませんので strtok を使わず文字配列を自身で弄る形にしたほうが良いかもしれません。
3
+
4
+ >いろいろ入れ替えたり()の中設定を変えたりしました
5
+
6
+ プログラムはテキトウに弄って動けば良いというモノではありません。機械式時計の歯車のように全て意味が有り噛み合ってこそのプログラムであり、ただ正解が出れば良いと運に任せるようでは勉強する意味が無いでしょう。
3
7
 
4
8
  以下は strtok を使わない場合です。
5
9
  二行目の最大文字数(100)が入る配列に gets で読み込み、各文字毎に判断して文字の表示もしくは改行・処理終了を行います。読み込んだ全てを処理すれば良いので N を使う必要はありません。

3

修正

2024/08/31 05:00

投稿

jimbe
jimbe

スコア13070

test CHANGED
@@ -2,7 +2,7 @@
2
2
  strtok を使うよう指示があるわけでもありませんので strtok を使わず文字配列を自身で弄る形にしたほうが良いかもしれません。
3
3
 
4
4
  以下は strtok を使わない場合です。
5
- 二行目の最大文字数(100)が入る配列に gets で読み込み、各文字毎に判断して文字の表示もしくは改行・処理終了を行います。
5
+ 二行目の最大文字数(100)が入る配列に gets で読み込み、各文字毎に判断して文字の表示もしくは改行・処理終了を行います。読み込んだ全てを処理すれば良いので N を使う必要はありません。
6
6
  ```c
7
7
  #include <stdio.h>
8
8
 

2

コード追加

2024/08/31 04:57

投稿

jimbe
jimbe

スコア13070

test CHANGED
@@ -33,3 +33,21 @@
33
33
  bbbbbb
34
34
  cccc
35
35
  ```
36
+
37
+ strtok を使うなら以下のようになります。
38
+ for ループ内に埋め込んでいますが、最初は第一引数に文字列の先頭を指定し、ループ二回目以降は NULL とします。
39
+ ```c
40
+ #include <stdio.h>
41
+ #include <string.h>
42
+
43
+ int main(void){
44
+ char b[100+1]; //最大100文字+終端文字分
45
+
46
+ gets(b); //一行目取得
47
+ int N = atoi(b); //(取得したけども使わない)
48
+ gets(b); //二行目取得
49
+ for(char *p=strtok(b, ","); p!=NULL; p=strtok(NULL,",")) { //文字列毎にループ
50
+ printf("%s\n", p); //文字列を表示
51
+ }
52
+ }
53
+ ```

1

コード追加

2024/08/31 04:50

投稿

jimbe
jimbe

スコア13070

test CHANGED
@@ -1,2 +1,35 @@
1
1
  何時どのような形で何を標準入力から取得し、何をループして何をするのか・・・つまり全体的な入出力の設計が出来ていません。 strtok うんぬんは末端のことで、それ以前の問題です。
2
2
  strtok を使うよう指示があるわけでもありませんので strtok を使わず文字配列を自身で弄る形にしたほうが良いかもしれません。
3
+
4
+ 以下は strtok を使わない場合です。
5
+ 二行目の最大文字数(100)が入る配列に gets で読み込み、各文字毎に判断して文字の表示もしくは改行・処理終了を行います。
6
+ ```c
7
+ #include <stdio.h>
8
+
9
+ int main(void){
10
+ char b[100+1]; //最大100文字+終端文字分
11
+
12
+ gets(b); //一行目取得
13
+ int N = atoi(b); //(取得したけども使わない)
14
+ gets(b); //二行目取得
15
+ for(int i=0; ; i++) { //文字毎にループ
16
+ if(b[i] == ',' || b[i] == '\0') { //区切りか文字列の終わりなら
17
+ printf("\n"); //改行
18
+ if(b[i] == ',') continue; //区切りなら次のループへ
19
+ break; //区切りじゃない(=文字列の終わり)なら終了
20
+ }
21
+ printf("%c", b[i]); //文字を表示
22
+ }
23
+ }
24
+ ```
25
+ 入力
26
+ ```
27
+ 3
28
+ aaaaa,bbbbbb,cccc
29
+ ```
30
+ 出力
31
+ ```
32
+ aaaaa
33
+ bbbbbb
34
+ cccc
35
+ ```