みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

c言語でintをchar*に代入

c言語を用いてマイコンにシリアル通信経由で値を書き込もうとしています.
PCからAscii(Aの場合は0x41)でマイコンにデータを送信し,マイコンで
static int receivedUART[30];
上記の変数に格納後し,書き込みのコマンドだと判断した場合に,
char *kWifiSsid
の変数に書き込みたいと考えています.

以下の関数を作成しました。
void setSSID(int *k){
char ssid[30] = {0};
for(int i = 0;i < SSID_LENGTH;i++){
char t;

if(*k == 10){
Serial.println("brek");
break;
}
t = (char)*k;

//最初のに2要素はコマンドのため無視
if((i != 0) && ( i != 1)){
ssid[i-2] = t;

}
++k;

}
kWifiPass = ssid;
}

上記の関数の引数にはreceivedUARTを指定しています.
しかし,上記ではうまくkWifiPassが書き換えられませんでした.
どのように改良すればintの値をchar*に書き込めますでしょうか?

投稿日時 - 2017-03-07 20:05:29

QNo.9302361

困ってます

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

C言語久しぶりなので、分かりにくいかもしれませんが、まず解説から

kWifiPass = ssid;

は正しくはkWifiSsidだと思いますが、細かい事はさておきkWifiSsidがグローバル変数であると想定しますが、上記の通りの代入ではkWifiSsidにssidの先頭のアドレスを設定しているだけです。なので、実際に値が設定されているわけではない事をご理解ください。setSSID()の関数が終了すると同時にssidは消滅しますが、これによりkWifiSsidには不定値が設定されます。(gccではそうでした。)

kWifiSsidに値を設定してあげるためには上記の代入式では設定出来ないので、memcpyやstrcpyなどを使用して値を設定してあげる必要がありますが、setSSID()の呼び出し元等でkWifiSsidのメモリを確保してあげる必要があります。
解説だと分かりづらいかと思いますので、以下サンプルを・・・
※細かい仕様は気にしないで作ってます。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SSID_LENGTH 30

char *kWifiSsid;

void setSSID(int *k)
{
char ssid[30];

memset(ssid, 0x00, sizeof(ssid));

for(int i = 0; i < SSID_LENGTH; i++)
{
if(*k == 10)
{
break;
}

if(i > 1)
{
ssid[i - 2] = *k;
}

k++;
}

// ssidに終端文字(\0)が含まれている事を想定
strcpy(kWifiSsid, ssid);
}

int main(void)
{
// テスト用変数
int k[30] =
{
65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
75, 76, 78, 79, 80, 81, 82, 83, 84, 85,
86, 87, 88, 89, 90, 70, 73, 75, 77, 79
};

// SSID分のメモリを確保しておく。
kWifiSsid = (char *)malloc(SSID_LENGTH);

setSSID(k);

// 値が設定されているか確認
printf("%s\n", kWifiSsid);

// メモリを解放
free(kWifiSsid);
}

投稿日時 - 2017-03-08 11:35:54

お礼

ご回答ありがとうございます.
>>setSSID()の関数が終了すると同時にssidは消滅します
正に上記の現象で悩んでおりました.
ポインタについての理解が乏しいですが,いただいたコードを参考にしてプログラム作成を行っていきます.
ありがとうございました.

投稿日時 - 2017-03-10 19:07:22

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

kWifiPassがグローバル変数だという前提ですが、現在の仕様ではssid(=kWifiPass)の中身は関数の終了とともに未定義となります。
memcpyなどで渡すかssidが消滅しないようにすればよいかと

投稿日時 - 2017-03-07 22:18:37

お礼

ご回答ありがとうございます.
ポインタに対する理解が浅いですので,おかしなコードを書いているようでした.ご指摘の内容を参考に勉強致します.
現状は取り合えずssidをグローバルな変数として定義すれば問題なく動作致しました.

投稿日時 - 2017-03-10 19:09:13

ANo.1

ポインタをちゃんと理解されていますか?

>kWifiPass = ssid;

はssidのアドレスをkWifiPassに設定するだけですよ?

投稿日時 - 2017-03-07 21:17:35

お礼

ご回答ありがとうございます.
ポインタに対する理解が浅いですので,おかしなコードを書いているようでした.ご指摘の内容を参考に勉強致します.

投稿日時 - 2017-03-10 19:08:18

あなたにオススメの質問