• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:scanf C言語)

C言語のscanfでカンマまでの文字列を多次元配列に入れる方法

このQ&Aのポイント
  • C言語のscanfを使用して、カンマまでの文字列を多次元配列に入れる方法がわかりません。
  • 例えば、「jgasogasog,dklafh343,fdjalsjfd,kldjfas5」という文字列を、array[0][0]に「jgasogasog」、array[0][1]に「dklafh34」といった形で入れたいです。
  • 現在のソースコードでは、ファイルからデータを読み込む際にカンマを区切り文字として使いたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • trapezium
  • ベストアンサー率62% (276/442)
回答No.3

> fscanf(fp, "%[^,],%d", &test[i][j]); %d は余計ですし対応する引数も指定されていません。またこの記述だと、二行目以降の読み取りに問題が出る気がします。 > char test[10][500]; これでは 10個分の 500 文字まで格納可能なバッファしか用意できていません。 全般的に変数の型指定と、実際のメモリイメージが把握できてないように思われます。また scanf(), printf() のフォーマット指定も不適切な使い方が多いのも課題でしょう。 かなり手抜きですが、叩き台として参考にどうぞ。err*() はエラーメッセージと exit() なので、適切に読み換えてください。strdup() は文字列を malloc() してコピーしてくれる関数です。あとはそんなに環境依存は無いと思いますが、なにかあれば補足で。 ------ #define MROW 1000 #define MCOL 50 int main(int argc, char *argv[]) { FILE *fp = stdin; char buf[256], buf2[10]; char *test[MROW][MCOL] = {{0}}; int i, j, n; if (argc > 1) { fp = fopen(argv[1], "r"); if (!fp) err(1, "%s", argv[1]); } i = j = 0; while ((n = fscanf(fp, "%255[^,\n]%1[,\n]", buf, buf2)) >= 0) { /* fprintf(stderr, " %d.%s.%s", n, buf, buf2); */ if (n > 0) test[i][j] = strdup(buf); else if ((n = fscanf(fp,"%1[,\n]", buf2)) < 0) break; else n++; if (n == 2 && buf2[0] == '\n') i++, j = 0; else if (n == 1) errx(1, "too long"); else j++; if (j >= MCOL || i >= MROW) errx(1, "out of range"); } for (i = 0; i < MROW; i++) { for (j = 0; j < MCOL; j++) if (test[i][j]) printf("%s\t", test[i][j]); if (test[i][0]) putchar('\n'); } return 0; }

その他の回答 (2)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.2

fscanfなんか使わないで、一文字ずつfgetcで読み込んで処理するアルゴリズムを考えてみてはいかがでしょうか?

回答No.1

fgetsで一行分まるっと読み込み、strtok使ってカンマ区切りで切り分けた方が確実じゃないかと。

losloson
質問者

お礼

ありがとうございます。fgetcまではやりましたが、このあとのstrtokの使用方法が難しいですね、調べてみます。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include<string.h> #define piyo 2 #define hoge 1400 int main(void) { FILE *fp; char *fname = "testfile.csv"; char *array[1400]; char c,i = 0; fp = fopen(fname, "r"); if (fp == NULL) { printf("%sファイルが開けません¥n", fname); return -1; } while ((c = fgetc(fp)) != EOF) { array[i] = (char)c; printf("%c",c); i++; } fclose(fp); return 0; }

関連するQ&A