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

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

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

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

Q&A

解決済

3回答

2179閲覧

C言語  コマンドパラメータを構造体で定義した配列に格納したい

kokok

総合スコア145

C

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

0グッド

0クリップ

投稿2019/08/30 02:55

編集2019/08/30 08:30

c

1 //構造体の定義 2typedef struct { 3 4 char srecord0_text[50]; //S0に入れるテキスト 5} opts_t; 6 7 8//オプション解析関数 9opt(int argc, char* argv[], opts_t* opts) { 10 11 int i = 0; 12 13 opts->srecord0_text = argv[i]; 14} 15 16 17//メイン関数 18int main(int argc, char* argv[]) { 19 20 opts_t opts; 21 opts.srecord0_text; 22 23 opt(argc,argv, &opts); 24 return 0; 25}

上記のコードだと

opts->srecord0_text = argv[i];

ここで、式は変更可能な左辺値である必要があります
とエラーが出てしまいます。

構造体で定義した配列に、コマンドパラメータのテキストを格納したいのですが、なかなか上手くいかないのでアドバイス頂けると助かります。

--追記2--

1:strcpy_s(opts->srecord0_text, 50, argv[i] );

としてみました。

2:opts.srecord0_text; 
デバッグで変数の中身を見てみると

0x00ebf908 "フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフ... char[0x00000032]

となっていました。

なので、コマンドパラメータが無くても、 CCCCCCCC  と出力されてしまいます(16進数表記)

これは、何の値が入ってしまっているのでしょうか?

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

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

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

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

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

Y.H.

2019/08/30 05:59

追記部分の、argvの添え字の変数「cnt」っていきなりどこから出てきたのでしょうか? 試した結果のみではなく、試した際のコードも追記しないと質問を見ている人には意味のない情報になります。
kokok

2019/08/30 08:30

ですね。修正しました。
guest

回答3

0

自己解決

1:strcpy_s(opts->srecord0_text, 50, argv[i] );

としてみました。

2:opts.srecord0_text; 
デバッグで変数の中身を見てみると

0x00ebf908 "フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフ... char[0x00000032]

となっていました。

配列の初期化で \n とすることで解決いたしました。

投稿2019/08/30 08:32

kokok

総合スコア145

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

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

0

char srecord0_text[50]; を
char *srecord0_text; にすれば
opts->srecord0_text = argv[i]; でOKになるかと。

投稿2019/08/30 04:25

tatsu99

総合スコア5440

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

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

0

opts->srecord0_text = argv[i];

argv[i] ってのはアドレスです。

やるなら、
strcpy(opts->srecord0_text,argv[i]);
だけど、バッファオーバーフローの危険があるので
memcpy(opts->srecord0_text,argv[i],sizeof(opts->srecord0_text));
ぐらいかなあ。


デバッグで変数の中身を見てみると

もしかして、コマンド引数を与えないで起動したんじゃないでしょうか
引数の数以上の領域にはでたらめな値が入ってると思いますよ

#回答だと質問の編集は通知こないのね

投稿2019/08/30 03:03

編集2019/08/30 08:40
y_waiwai

総合スコア87774

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

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

Y.H.

2019/08/30 03:17

最近のC言語的界隈の事にかなり疎いんですが、strcpy_s() ってこういうときの回答に使っても問題ないんですかね:-] もう標準関数(?)適な位置付けにあるならこっちの方がいいかも。 回答のmemcpy()ではコピー元の参照時に範囲外のメモリを参照してしまうので。
y_waiwai

2019/08/30 03:25

そうですね、それが使えるならそっちのほうがいいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問