質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

2308閲覧

カンマ区切りのファイルを一行ずつ二次元配列に入力したい。

Savanof

総合スコア33

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/07/01 09:10

編集2021/07/01 09:45

前提・実現したいこと

C言語でカンマ区切りのファイルを読み込み、二次元配列に収納するプログラムの実装をしたいと思っています。サンプルファイルとしては以下のような形です。

a,100 b,100 c,100
satou,apple katou,orange itou,grape

コマンドラインからファイルを受け取り、fgetsで一行ずつ読み込み、sscanfで要素を取り出し、それぞれを二次元配列に入れようと思っているのですが、printfで何も出力されず、while文の中でprintfデバックするためにprintf("Hi")みたいなコードを入れても何も出力されませんでした。

該当のソースコード

#include <stdio.h> #include <stdlib.h> // コマンドラインからの入力を受け取るので、int argc : 引数の個数, char *argv[] : 引数の配列(ポインタ) int main(int argc, char *argv[]) { // もしコマンドラインからの入力が無い , 1個以上の場合は強制終了 if (argc == 1) { printf("You must input file"); exit(-1); }else if(argc >= 3){ printf("You must input single file"); exit(-1); } //ファイル型のポインタ変数を作成 FILE *fp; // 元ファイルを書き変える事はないので、読み出し専用 fp = fopen(argv[1], "r"); if (fp == NULL){ printf("File is Invaild."); exit(1); } //ファイルが終わるまで読み込む //二次元配列に放り込む、 // fgetsから受け取る文字サイズ char str[150]; // ファイルを読み込んだ結果を収容する二次元配列(0:Key 1:Contens) char Dic_2darray[100][2]; int i=0; while (fgets(str,150, fp)) { sscanf(str,"%s,%s",&Dic_2darray[i][0],&Dic_2darray[i][0]); printf("%s %s\n",Dic_2darray[i][0],Dic_2darray[i][1]); i++; } fclose(fp); }

試したこと

似たような事を実装しようとしている例を探してみて、真似てみたのですが上手くいきませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itagagaki

2021/07/01 09:31

うまくいかなかったというのは、どういう結果になったのですか? コードをちゃんと調べてはいませんが、とりあえず sscanf(str,"%s,%s",&Dic_2darray[i][0],&Dic_2darray[i][0]); は sscanf(str,"%s,%s",&Dic_2darray[i][0],&Dic_2darray[i][1]); の間違いではないですか?
Savanof

2021/07/01 09:37

Zuishinさん、こんばんは。 今まで私はVB.netを使った事は無いですし、質問のフォーマット文体もかなり違うので恐らく他の方だと思うのですが...
Savanof

2021/07/01 09:41

itagagakiさん すいません、それは自分の記述ミスです。 「うまくいかなかった」というのは、コマンドラインから受け取ったカンマ区切りファイルからの入力が受け取れず、何もprintfしなかったいう事です。質問文を修正します。 指摘ありがとうございます。
BeatStar

2021/07/01 10:05

>> 似たような事を実装しようとしている例を探してみて、 その具体例を出してください。 私ら回答者が提示しても『それやったけど出来んかったから聞いてんだろが!!!』と逆ギレする人が多すぎです。 知らねーよって話です。 回答者は質問者と同じ環境にある…わけじゃないので、提示された情報からしか読み取れません。 それを、情報を出し渋って後出しアンド逆ギレはお門違いです。 (質問者さんがそうだとは言っていませんが、そういうタイプが多い) なので『試したこと』ぐらいは書きましょうよ。
BeatStar

2021/07/01 10:07

それと、多分タイプミスだとは思うのですが、 (コメント文にて) >> もしコマンドラインからの入力が無い , 1個以上の場合は強制終了 は変です。『1個以上』じゃありません。
guest

回答1

0

ベストアンサー

char Dic_2darray[100][2];

ということは、Dic_2darray[i][0]の型はcharです。

150文字までの文字列を入れる場所を2列100行用意するのなら

C

1char Dic_2darray[100][2][150];

となります。

投稿2021/07/01 09:57

itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Savanof

2021/07/01 10:16

すみません、解決しました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問