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

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

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

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

Q&A

解決済

1回答

654閲覧

コマンド引数からyamlファイルを読み取りたい。

Gingerale09

総合スコア8

C

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

0グッド

0クリップ

投稿2023/03/27 00:20

編集2023/03/27 01:19

実現したいこと

- コマンド引数からデータを読み取り、格納する。

前提

C言語でデータを分析する課題をやっています。課題のためコマンドの入力を変えることができないです。

発生している問題・エラーメッセージ

コマンド引数を読み取りたいのですが、ファイルのタイトルに””が付いていることで正常にファイルを読み込むことができず、設定したエラー”Error: Data file not specified. Please include '--DATA' flag followed by file name.” が表示される。

該当のソースコード

C言語

試したこと

strcmpを使うのほかにsscanfでもやってみたのですが、結果は同じで、コマンド引数に””があると読み込めませんでした。

 void parse_commandline(char *argv[]) {
char *data_file;
int question_num;
int n;

if (strcmp(argv[1], "--DATA") == 0) { data_file = argv[2]; } else { fprintf(stderr, "Error: Data file not specified. Please include '--DATA' flag followed by file name.\n"); exit(1); } if (strcmp(argv[3], "--QUESTION") == 0) { question_num = atoi(argv[4]); } else { fprintf(stderr, "Error: Question number not specified. Please include '--QUESTION' flag followed by a number.\n"); exit(1); } if (strcmp(argv[5], "--N") == 0) { n = atoi(argv[6]); } else { fprintf(stderr, "Error: 'n' value not specified. Please include '--N' flag followed by a number.\n"); exit(1); } // Print parsed arguments printf("Data file: %s\n", data_file); printf("Question number: %d\n", question_num); printf("n: %d\n", n); // Call appropriate function based on question number if (question_num == 1) { node_t *head = read_yaml(data_file); char **top_airlines = get_top_airlines(head, n); print_top_airlines(top_airlines, n); free_top_airlines(top_airlines, n); free_list(head); } else if (question_num == 2) { fprintf(stderr, "Here we are question_num == 2\n"); exit(1); node_t *head = read_yaml(data_file); char **top_airlines = get_top_airlines(head, n); print_top_airlines(top_airlines,n); free_top_airlines(top_airlines,n); free_list(head); } else if (question_num == 3) { fprintf(stderr, "Here we are question_num == 3\n"); exit(1); // node_t *head = read_yaml(data_file); // char **top_airlines = get_top_airlines(head,n); // print_top_airlines(top_airlines,n); // free_top_airlines(top_airlines,n); // free_list(head); } else { fprintf(stderr, "Error: Invalid question number. Please select question 1, 2, or 3.\n"); exit(1); }

}

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

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

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

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

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

episteme

2023/03/27 00:35 編集

コマンド引数には何と与えられているのですか? yaml/Objective-C とは何の関係がありますか?
Gingerale09

2023/03/27 01:16

./airport_manager --DATA="airport-route.yaml" --QUESTION=3 --N=8などのような入力をし、プログラムを実行したいです。
episteme

2023/03/27 01:42 編集

argv[1]が --DATA="airport-route.yaml" なら strcmp(argv[1], "--DATA") が 0 になるわけないやん。 > コマンド引数に””があると読み込めませんでした。 ""がなければ( --DATA=airport-route.yaml なら)読み込めますか? 確認しました?
Gingerale09

2023/03/27 01:41

はっ!!!全然気がつきませんでした。ありがとうございました!
Gingerale09

2023/03/27 01:51

--DATA=airport-route.yaml なら読み込めていたので、ずっと””の問題だと思い込んでいました。
episteme

2023/03/27 01:54

argv[1]が --DATA=airport-route.yaml なら strcmp(argv[1], "--DATA") が 0 になるわけないやん。 --DATA airport-route.yaml なら 読めるだろうけど
Gingerale09

2023/03/27 01:56

失礼しました。--DATA airport-route.yamlでした。。この度はありがとうございました。epistemeさんが教えてくれなければもう1日考えてました!
episteme

2023/03/27 01:58

あ、やっぱり。
jimbe

2023/03/27 03:39 編集

そもそもちゃんとコマンドラインパラメータを解析するための関数(getopt)が既にあるのですから、逆にそちらに仕様を合わせたりして parse_commandline なんて作る必要は無いはずなんですけど。 (変えられないなら仕方ないですが。)
guest

回答1

0

ベストアンサー

C

1// foo.c 2#include <stdio.h> 3 4void parse_commandline(char *argv[]) { 5 char *data_file; 6 7 if (strcmp(argv[1], "--DATA") == 0) { 8 data_file = argv[2]; 9 } else { 10 fprintf(stderr, "Error: Data file not specified. Please include '--DATA' flag followed by file name.\n"); 11 exit(1); 12 } 13 printf("data_file = [%s]\n", data_file); 14} 15 16int main(int argc, char* argv[]) { 17 parse_commandline(argv); 18 return 0; 19}

実行結果:

g:\work>foo --DATA "foo.yaml" data_file = [foo.yaml]

...何の問題もないけども。

[追記]

./airport_manager --DATA="airport-route.yaml" --QUESTION=3 --N=8などのような入力をし、プログラムを実行したいです。

C

1// foo.c 2#include <stdio.h> 3#include <string.h> 4 5void parse_commandline(char *argv[]) { 6 char* data_file; 7 char* eq_pos = strchr(argv[1],'='); 8 if ( eq_pos != NULL && strncmp(argv[1], "--DATA", 6) == 0) { 9 data_file = eq_pos+1; 10 } else { 11 fprintf(stderr, "Error: Data file not specified. Please include '--DATA' flag followed by file name.\n"); 12 exit(1); 13 } 14 printf("data_file = [%s]\n", data_file); 15} 16 17int main(int argc, char* argv[]) { 18 parse_commandline(argv); 19 return 0; 20}

実行結果

g:\work>foo --DATA="airport-route.yaml" data_file = [airport-route.yaml]

投稿2023/03/27 01:14

編集2023/03/27 01:34
episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問