• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語 ; で区切った文字を別々の配列に入れる)

C言語で区切った文字を別々の配列に入れる方法

このQ&Aのポイント
  • C言語を勉強中の質問者が、文字列を「;」で区切り、それぞれを別々の配列に格納したいという問題を抱えています。
  • 質問者はfscanf関数を使用してファイルから一行ずつ読み込み、指定されたフォーマットにそって区切りたいと考えています。
  • しかし、現在の実装はスペースで区切られてしまい、望む結果を得ることができません。質問者はより良い関数やアイディアを求めています。

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

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

エラー処理を考慮しないのであれば... fscanf(fp, "%29[^;];%29[^\n]%*c", eng, pir) のようにすれば実現できます。

maman19
質問者

お礼

できました!!!これだけで3時間くらい悩んだのに。。。ありがとうございました^^

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

> 調べるとfscanf(ファイル、フォーマット)という関数を見つけて、これだとフォーマットにそって、一行ずつ読んでくれるというのがわかりました。 「一行ずつ読む」というのは嘘、あるいは、初心者用に詳細を省略したいい方です。fscanfでは、実際は、殆どの場合で改行は空白と同じあつかいになります。 フォーマット文字列がわからないのなら、リファレンスマニュアルの該当項目をよく読みましょう。 他の言語の経験があるのなら、思い込みでCのプログラミングをするのは、とても危険なことです。 だから「マニュアルを読みましょう」質問はそのあとです。 特に、Javaの経験があるのなら、中途半端に似ているだけに、きちんと分けて覚えないと。 Javaでは意識しないでよかった、文字列操作やメモリ管理が重要になってきます。 その意味では、なぜ「今日から始めました」でこんな内容なのかが気になります。もうちょっと基礎の勉強をしてもよいのでは? > 関係ないですけど。C勉強してJAVAがものすごい大好きってことに気づきました 言語論争するつもりはないですが、こんなこと言うならJavaでやりゃいいじゃん、ってなりませんかね?

maman19
質問者

お礼

ご回答ありがとうございました。 フォーマットを読んだのですが、よくわからなかったので質問させていただきました。 これは、私が好きでやっているのではなくて、学校で出された課題についての質問です。授業が始まってすぐ出されて、自分でCを勉強しながら3日で仕上げなくてはいけないプログラムなので、基礎をしっかりと。。というのは分かるのですが、他のプログラムも書かなければいけないので、はっきりいって時間がありません。 Javaで全部かけるなら、最初から書いてます(´・ω・`) fscanfでは、殆どの場合で改行は空白と同じあつかいになる事がわかりました、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

これくらい(一行読んで分割)ならfgetsで読んでstrtokでもOKでしょう。

maman19
質問者

お礼

strtok()という関数があるんですね。これはこれからも使えそうなので、調べて、機会があればこのプログラムの中で使ってみたいと思います。Cはメモリーの事よくも考えないといけないんですね、、、難しいです。。。 ありがとうございました^^

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語 教えてください

    data.txtの中に入っているデータを読み込み、 全て出力するというプログラムを作ろうとしています。 しかし、上手く読み込み表示させることが出来ません。 自分で出来るだけ調べたのですが、 どこがおかしいのかわからないので教えてください。 ↓↓↓現在作っているプログラムです↓↓↓ #include <stdio.h> void main(void) { FILE *fp; char number, name; if ((fp = fopen("data.txt", "r")) == NULL) { printf("FILE OPEN ERROR\n"); } else { while (fscanf(fp, "%s%s", number, name) == 2) { printf("%s-%s\n", number, name); } } fclose(fp); printf("FILE CLOSE !!\n"); } ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↓↓data.txt↓↓ 001 aaa 002 bbb 003 ccc 004 ddd 005 eee ↑↑↑↑↑↑↑↑ よろしくお願いします。

  • C言語初心者の質問 fscanf

    C言語を勉強し始めた初心者です。 後述するプログラムにおいて、カレントディレクトリ上にあるフォルダー(data)内のファイル名をfscanfで読み込んで、標準出力で表示するプログラムを作っています。 コンパイルはうまくいくのですが、プログラムを実行しようとするとプログラムが停止してうまくいきません。 不具合点と改善点をおしえてください。 実行環境?はwindows7,visual studio 2013 です。 #include<stdio.h> int main(void) { int i=0; char s[100][100]; FILE *fp; fp=fopen(".\\data","r"); while((fscanf(fp,"%s",&s[i][100]))!=EOF){ printf("%d:%s\n",i,s[i][100]); i++; } return 0; }

  • C言語 配列

    ご質問させていただきます。 CSVファイルからデータを呼び出し、二次元配列として出力したいのですが上手くいきません。 CSVファイルには英数字が混ざっており、エクセルでいう、11行と1440列ほどのデータがあります。初心者なりに書いてみたのですが、どこから手を付けたらいいかわかりません。 三次元配列にしないといけないとのアドバイスをいただいたのですがどのようにすればいいかわかりませんヒントを頂けるとたすかります。 元のcsvファイルは例ですがこのような下記のような構造になっていて2行目にいったときに[0][0]から[1][0]と変わっていってほしいです。 testt,esttest,testte,stte,sttest testte,sttes,ttest,~ 理想 [0][0] = [testtesttest] [0][1] = [testtesttesttest] 一行が終わりしだい [1][0] = [testtesttesttest] と変わっていくようにしたいです。 エラーが出ますが、コードを記載させていただきます。 コード #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main(void) { //ストリームポインタ FILE *fp; int kk = 0; int nn = 0; int hoge; //ファイルから読み込んだテキスト1行分を格納するためのchar配列を指定します int piyo[11][1440]; //*filename : 開くファイル名を指定 char *fname = "./test1/test2/201509/test.csv"; //ファイルが無かったり,指定フォルダでなければ、FILE変数fpはNULLが返ります。 fp = fopen(fname, "r"); //NULLが返ってきた場合の処理 if (fp == NULL) { printf("%sファイルが開けません¥n", fname); return -1; } //ファイルから1行ずつ読み込む成功すると、読み込んだ文字列のポインタを返し、失敗すると、NULLを返します。 while (1 == fscanf(fp, "%c,", &hoge)) { piyo[kk][nn] = hoge; printf("[%d][%d]=%d\n", kk, nn, piyo[kk][nn]); nn++; if (1440 == nn) { kk++; nn = 0; } } //FILE *fp : fopen()で取得したファイルポインタ fclose(fp); return 0; }

  • c言語プログラムについて

    http://www.post.japanpost.jp/zipcode/dl/kokagi.html から全国一括(1,735,160Byte)をダウンロード このファイルを使って、 Linuxマシン上で、 例えば、北海道札幌市中央区旭ケ丘 と入力すれば、0640941 と返却されるプログラム(引数はコマンドラインで)をcで作成したいと思っているのですが、ファイルのダウンロードとファイルの読み込みまでは出来たのですが、その後の「北海道札幌市中央区旭ケ丘 と入力すれば、0640941」からが分かりません。どなたか続きを教えて頂けないでしょうか? 使用OS:fedora 一応、ソースを載せておきます #include <stdio.h> int main(void){ FILE *fp; char *fname="ken_all.csv"; char d[100]; char e[100]; char f[100]; char g[100]; char h[100]; char i[100]; int ret,a,b,c; fp = fopen("ken_all.csv", "r"); if (fp == NULL) { printf("ファイルをオープンできませんでした\n",fname); return -1; } while( (ret = fscanf( fp, "%[^, ],%d,%d,%s,%s,%s,%s,%s,%s", &a, &b, &c, d, e, f, g, h, i ) ) != EOF ){ printf( "%d %d %d %s %s %s %s %s %s", a, b, c, d, e, f, g , h , i); } fclose(fp); return 0; }

  • ファイルの入出力で困っています(C言語)

    はじめまして、nathan3と申します。 昔、さらっとC言語を学んでいたので、仕事場でも活用できればと思い、勉強しなおしています。 以下のプログラムですが、コンパイルはするものの、実行がなされません。 sprintfをつかってファイルを作り、fprintfで読み込み、countで繰り返し別名のファイルを読み込み・作成し…といったプログラムを書いているつもりです。 調べながら書いた稚拙なプログラムですが、ここがちがう!というところをお教えいただけると大変助かります。 #include <stdio.h> int main(void){ FILE *fp,*fo; char *fname1; char *fname2; char s[100],t[100]; int ret,count; for(count = 0 ; count < 3 ; count++) { sprintf(fname1, "sankasha%d.txt", count); fp = fopen(fname1, "r"); if (fp == NULL){ printf("%s can't open a file\n", fname1); return -1; } sprintf(fname2, "matome%d.txt", count); fo = fopen(fname2,"w"); if (fo == NULL){ printf("%s can't open a file\n", fname2); return -1; } printf("--fscanf---"); while( (ret = fscanf(fp,"%[^,],%s", s, t)) != EOF ){ fprintf(fo,"%s ", t); } } fclose(fo); fclose(fp); return 0; } 何度見直しても間違いが見つからず困窮しております。 どうぞ、みなさまのお力をお貸しください! よろしくお願いいたします。

  • C言語  二次元配列

    C言語をやることになり苦戦しています。 CSVファイルからデータを呼び出し、二次元配列として出力したいのですが上手くいきません。 CSVファイルには英数字が混ざっており、エクセルでいう、11行と1440列ほどのデータがあります。初心者なりに書いてみたのですが、どこから手を付けたらいいかわかりません。 是非ヒントを頂けるとうれしいです。よろしくお願いします。 理想 [0][0] = [testtesttest] [0][1] = [testtesttesttest] 一行が終わりしだい [1][0] = [testtesttesttest] と変わっていくようにしたいです。 エラーが出ますが、コードを記載させていただきます。 コード #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main(void) { //ストリームポインタ FILE *fp; int kk = 0; int nn = 0; int hoge; //ファイルから読み込んだテキスト1行分を格納するためのchar配列を指定します int piyo[11][1440]; //*filename : 開くファイル名を指定 char *fname = "./test1/test2/201509/test.csv"; //ファイルが無かったり,指定フォルダでなければ、FILE変数fpはNULLが返ります。 fp = fopen(fname, "r"); //NULLが返ってきた場合の処理 if (fp == NULL) { printf("%sファイルが開けません¥n", fname); return -1; } //ファイルから1行ずつ読み込む成功すると、読み込んだ文字列のポインタを返し、失敗すると、NULLを返します。 while (1 == fscanf(fp, "%c,", &hoge)) { piyo[kk][nn] = hoge; printf("[%d][%d]=%d\n", kk, nn, piyo[kk][nn]); nn++; if (1440 == nn) { kk++; nn = 0; } } //FILE *fp : fopen()で取得したファイルポインタ fclose(fp); return 0; }

  • C言語でコマンドmvを実行

    name.txtというテキストファイルがあり、中身は 123 abc 456 def … となっています。 このテキストファイルを1行ずつ読み込んで、 mv 123/ abc/ のようにテキストファイルの中身に沿って、ディレクトリの名前を一気に変更したいのですが、上手くいきません。 どこがおかしいか、教えていただけないでしょうか。 /* header files */ #include <stdio.h> #include <stdlib.h> /* main */ int main(int argc, char *argv[]) { char *buff; float ret, ter; char a[50],b[50]; FILE *fp, *fq; fp = fopen(argv[1], "r"); while((ret = fscanf(fp,"%s %s",a,b)) != EOF){ sprintf(buff, "mv %s %s",a,b); system(buff); } fclose(fp); return EXIT_SUCCESS; }

  • c言語 

    データを構造体の配列に格納したいのですが、このやり方ではできませんでした。どうすればいいですか? (ファイル内のデータを読み込んで格納しようとしています。) typedef struct dataset{ int price; char id; char name; }data; int main(void) { FILE *f = fopen("input.txt","r"); FILE *output = fopen("output.txt","w"); char order[100]; char name[100]; char id[100]; int price; int num = 0; while(fscanf(f,"%s",order) != EOF){ fscanf(f,"%s%s%d",product->name[num],product->id,&product[num].price); num++; } } return 0; } input.txt CD Kenji 300 DVD Nanako 350 PC Koki 1000 ........

  • [動的配列]C言語の勉強で簡単な単語帳プログラム

    C言語の勉強として以下のような簡単なプログラムを作りました。 テキストファイルからユーザが入力した単語を検索し、ヒットしたものだけ その単語とその説明を表示するというプログラムです。 正常に動いているようなので、 つぎはループごとに、読み込んだ文字数に合わせて 配列(mean)の要素数を動的に確保するということを しようと思うのですがどのタイミングでmallocやreallocを入れればよいのか いまいちよくわかりません。 また、このプログラムの欠点などありましたら教えていただけると助かります。 よろしくお願いします。 --------------------------------------------------------------------- //マイ単語帳プログラム #include<stdio.h> #include<stdlib.h> #include<string.h> main(){ char input[100]; //ユーザが入力した文字列を格納 char tango[200]; //ファイルの単語 char mean[1000]; //ファイルの説明 char conti; //検索を続けるかどうかの入力 int flag; //検索単語がヒットした場合に立てるフラグ FILE *fp; //単語ファイルのopen if((fp=fopen("tango.txt","r"))==NULL){ printf("ファイルが開けません。"); exit(1); } /*******************ファイルからの文字列読み込み****************************/ //Yが入力されるまで検索を続ける do{ printf("検索する単語を入力してください。\n"); scanf("%s",input); printf("検索対象:%s\n\n",input); flag=0; //ヒットしたかどうかのフラグの初期化 while((fscanf(fp," %s %s",tango,mean))!=EOF){ //fscan 書式を指定して読み込める。 if(strcmp(tango,input)==0){ //strcmpは2つの引数が同じ時0を返す printf("%s\n%s\n\n\n",tango,mean); flag=1; //ファイル内に単語があった場合にフラグを立てる。 } } rewind(fp); if(flag==0){ printf("その単語は登録されていません。\n"); } printf("検索を終了しますか? ==> Y\n"); printf("検索を続けるにはY以外の文字を入力してください。\n"); scanf(" %c",&conti); //scanfの問題点を回避するために読み込み前に半角スペース } while(conti!='Y'); /**************************************************************************/ fclose(fp); return; } ---------------------------------------------------------------- tango.txt apple リンゴ SMTP 電子メールの送信や転送を行うためのプロトコル。 rewind 形式:rewind(ファイルポインタ); C言語のファイルシステム関数。ファイルの現在位置をファイルの先頭に置くことができる。

  • C言語のソートについて

    C言語で下記のファイルの中身を昇順と降順で出力しようとしているのですが、ソートが上手くいっていない状況です。 どなたか修正点を教えて頂けないでしょうか? 「ファイルの中身」 2022/11/14 16:19:56 4+4,8.000000 2022/11/14 16:20:14 7+7,14.000000 2022/11/14 16:20:18 8+8,16.000000 2022/11/15 16:19:56 4+4,8.000000 2022/11/14 16:20:14 7+7,14.000000 2022/11/18 16:20:18 8+8,16.000000 2022/11/17 16:19:56 4+4,8.000000 2022/11/14 16:20:14 7+7,14.000000 2022/11/14 16:20:18 8+8,16.000000 「ソースコード」 #include <stdio.h> #include <string.h> #include <stdlib.h> int cmp_u(const void* a, const void* d) { return *(char*)a - *(char*)d; } int cmp_d(const void* a, const void* d) { return *(char*)d - *(char*)a; } int main() { int r,i,n; FILE* fp; char sin[9][1000]; fp = fopen("log.txt", "r"); if (fp == NULL) { printf("ファイルオープン失敗\n"); return -1; } for (i = 0; i < 9; i++) { fscanf(fp, "%s", &(sin[i])); } fclose(fp); printf("ASC or DESC: "); scanf(" %s", &ad); if (strcmp(ad, "ASC") == 0) { qsort(sin, 9, sizeof(char), cmp_u); } else { qsort(sin, 9, sizeof(char), cmp_d); } for (i = 0; i < 9; i++) { printf("%s\n", sin[i]); } return 0; }