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

回答編集履歴

1

誤解

2015/07/28 02:48

投稿

KenTerada
KenTerada

スコア751

answer CHANGED
@@ -6,4 +6,56 @@
6
6
  len = strlen(buf);
7
7
  fgets(&buf[len], buflen - len, fp);
8
8
  }
9
- ```
9
+ ```
10
+
11
+ P.S.
12
+ 質問文を読み直して,もしや「名前を配列に格納したい」ということかと思いました.
13
+ ということで,とりあえずそのような関数と使い方を書き直します.
14
+ ```c
15
+ #include <stdio.h>
16
+ #include <string.h>
17
+
18
+ void get2lines(FILE *fp, char *buf, int buflen)
19
+ {
20
+ int len;
21
+ fgets(buf, buflen, fp);
22
+ len = strlen(buf);
23
+ fgets(&buf[len], buflen - len, fp);
24
+ }
25
+
26
+ void get_names(char **names, int namelen, char *buf)
27
+ {
28
+ int c = 0, i = 0;
29
+ while(c < namelen) {
30
+ names[c] = &buf[i];
31
+ while (buf[i] != ' ' && buf[i] != '\n' && buf[i] != '\0')
32
+ i++;
33
+
34
+ if (buf[i] == '\0') {
35
+ c++;
36
+ break;
37
+ }
38
+ buf[i] = '\0';
39
+ i++;
40
+ c++;
41
+ }
42
+ names[c] = NULL;
43
+ }
44
+
45
+ int main(void)
46
+ {
47
+ char buf[512];
48
+ char *names[32];
49
+ int i;
50
+ FILE *fp = fopen("test.txt", "r");
51
+ get2lines(fp, buf, 512);
52
+ get_names(names, 32, buf);
53
+ for (i = 0; names[i] != NULL; i++)
54
+ printf("%s\n", names[i]);
55
+ }
56
+ ```
57
+ エラーチェックなどは基本的にしていないので,
58
+ 安全なアプリケーションである必要があるのであれば,
59
+ もっと真面目にチェックしないといけません.
60
+ このテストケースの場合,スペースなどの読み飛ばす文字が2つ続く場合や,
61
+ ファイルが存在しない場合などにエラーや想定しない動作をすることがあります.