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

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

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

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

Q&A

解決済

2回答

1625閲覧

C言語でUNIONを使用しての文字列結合

RateL2ch

総合スコア7

C

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

0グッド

0クリップ

投稿2017/08/28 04:54

###前提・実現したいこと
ATコマンド作成用の構造体を共用体で定義したい。

###発生している問題・エラーメッセージ
at, cmd, paramともに文字を挿入し、at_cmdで全て結合された文字列を抽出したいのだが、なぜか最初のatの部分の文字しか入っていない。

###該当のソースコード
// ATコマンド自動生成用構造体
union ATCOMMANDS{
char *at_cmd;
struct {
char *at; // 先頭部のAT+を定義(ここは"AT+"で固定)
char *cmd; // コマンド部を記述
char *param; // パラメーター部分を記述
}cmdList;
};

###補足情報(言語/FW/ツール等のバージョンなど)
C言語 組込開発

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

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

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

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

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

mattn

2017/08/28 05:13

文字列のバッファとポインタについて、さらに union の使い方、いずれも間違っておられます。まずは何をされたいのか書かれた方が良いかと思います。
guest

回答2

0

ベストアンサー

文字列をポインタで宣言しているようでは、要望は実現できません。
またこの方法だと固定長であれば良いですが、cmd部などが可変長になると対応できません。
しかしATコマンドであれば、コマンド部は1桁(でしょうか?)と限定すれば、次のようにすればなんとかなります。

C

1#include <stdio.h> 2#include <string.h> 3int main(void) 4{ 5 union ATCOMMANDS{ 6 char at_cmd[42]; 7 struct { 8 char at[3]; // 先頭部のAT+を定義(ここは"AT+"で固定) 9 char cmd[1]; // コマンド部を記述 10 char param[10]; // パラメーター部分を記述 11 }cmdList; 12 }; 13 14 union ATCOMMANDS at; 15 16 memcpy(at.cmdList.at, "AT+", 3); 17 memcpy(at.cmdList.cmd, "B", 1); 18 strcpy(at.cmdList.param, "0"); 19 20 printf("[%s]\n", at.at_cmd); 21} 22 23[AT+B0]

まずはC言語における文字列、そして共用体について再度学習してから作業を進めるのが良いと思います。

投稿2017/08/28 05:36

編集2017/08/28 05:41
ttyp03

総合スコア16998

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

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

mattn

2017/08/28 05:39

最後の &at.at_cmd の & は必要ないかと。
ttyp03

2017/08/28 05:40

おっと、失礼。 指摘ありがとうございます。 修正しておきます。
guest

0

文字列のバッファとポインタの違い、union いずれも使用方法を間違っておられるのでどう回答すべきか迷いますが。もしやろうとされている事が

at_cmd に文字列の先頭ポインタを設定した後、cmdList.at や cmdList.cmd で参照

をしようとされているのか

cmdList.at や cmdList.cmd で設定した後で at_cmd で結合された文字列を参照

をしようとされているのか分かりません。

後者であればポインタでなく文字列のバッファを作り、そこにコピーする必要があります。ただしC言語で文字列は NUL 終端しなければまりません。最終的に at_cmd から結合された文字列を得たいという事であれば空白等で埋めておく必要があります。

c

1#include <stdio.h> 2#include <memory.h> 3#include <string.h> 4 5int 6main(int argc, char* argv[]) { 7 // ATコマンド自動生成用構造体 8 union ATCOMMANDS{ 9 char at_cmd[10]; 10 struct { 11 char at[4]; 12 char cmd[4]; 13 char param[4]; 14 }cmdList; 15 }; 16 union ATCOMMANDS a; 17 memset(&a, 0, sizeof(a)); 18 memset(&a, ' ', sizeof(a)-1); /* 予め空白で埋めておく */ 19 memcpy(a.cmdList.at, "foo", 3); 20 memcpy(a.cmdList.cmd, "boo", 3); 21 memcpy(a.cmdList.param, "baz", 3); 22 puts(a.at_cmd); 23 return 0; 24}

投稿2017/08/28 05:28

編集2017/08/28 07:38
mattn

総合スコア5030

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問