C言語でintをchar*に代入

このQ&Aのポイント
  • C言語を用いてマイコンにシリアル通信経由で値を書き込む方法を教えてください。
  • マイコンにASCIIコードでデータを送信し、受信した値をint型の配列に格納し、char型の変数に書き込む方法を教えてください。
  • int型の値をchar*に変換するための関数を作成しましたが、うまく動作しません。どのように改良すればいいでしょうか?
回答を見る
  • ベストアンサー

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*に書き込めますでしょうか?

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

  • ベストアンサー
回答No.3

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); }

con014057
質問者

お礼

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

その他の回答 (2)

  • yelser
  • ベストアンサー率72% (8/11)
回答No.2

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

con014057
質問者

お礼

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

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.1

ポインタをちゃんと理解されていますか? >kWifiPass = ssid; はssidのアドレスをkWifiPassに設定するだけですよ?

con014057
質問者

お礼

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

関連するQ&A

  • c言語 int型の数字をchar型の配列に

    c言語についてです。 int型の数字をchar型の配列に入れたいです。 関数に対してint型の数字を文字列として渡し、 関数内でchar型の配列に格納したいです。 例として、 a(char a[]){  ~~  ~~ } int main(void){ int x = 5678;  ~~  a(x); } とできるようにしたいです。 しかしこれだと5678という値がそのままchar型の一つの配列に入る?ため正しくないです。 欲しい結果としてはちゃんとa関数内で、 a[1] = '5' a[2] = '6' a[3] = '7' a[4] = '8' となってほしいです。 もともと渡す値が”5678”となっていれば結果は正しく出るのですが、 渡す値がint型と決まっているためどうにかして5678を”5678”とすればいいのではないかと考えています。 つまり5678を単純に文字列に変換すればいいのでしょうか? またプログラム内ではsprintfやatolを使用しないで実現させたいです。 難しいかもしれませんがお願いします。 なんだか説明が下手ですみません。 お願いいたします。

  • char型+char型ってint型? if(char型==int型)?

    C言語の「汎整数拡張(インテグラルプロモーション)」というものに関するものだと思います。 char型とchar型を加えた結果は、char型でしょうか。それともint型でしょうか。 (下のプログラムの printf("sizeof(a[0]+a[1])は%d\n", sizeof(a[0]+a[1])); /* char型+char型 */ という部分の結果は4なので、int型と考えるべきなのかな。) 私は、char型とint型の加算の結果はint型だと思っていましたが、 char型とchar型の加算の結果はやはりchar型だと思っていました。 (それが間違えているのでしょうか。) if(a[0]==i) /* char型とint型の比較(?) */ の部分では、左辺はchar型、右辺はint型ですが、このように型の違う変数を比較しても文法上構わないのでしょうか。 (私は、「比較は必ず型の同じもの同士でしかできない」と思っていました。) 左辺はchar型のように見えて、じつはint型ですか。 #include <stdio.h> int main(void) { char a[4]; int i=77; printf("sizeof(int)は%d\n", sizeof(int)); printf("sizeof(char)は%d\n", sizeof(char)); printf("sizeof('M')は%d\n", sizeof('M')); printf("sizeof(a[0])は%d\n", sizeof(a[0])); a[0]='M'; a[1]=7+6; a[2]=a[0]+a[1]; printf("sizeof(a[0]+a[1])は%d\n", sizeof(a[0]+a[1])); /* char型+char型 */ printf("sizeof(+a[0])=%d\n", sizeof(+a[0])); if(a[0]==i) /* char型とint型の比較(?) */ puts("a[0]==i"); else puts("a[0]!=i"); return(0); } ちなみにワーニングもエラーもなんにもでません。

  • なんでchar型なんでしょうか??

    なぜここ(☆☆)で char型なのかが よく・・いやさっぱりわかりません。 他の型ではだめなんでしょーか? この関数自体は挿入ソートだとわ思われるんで なんとなくこの☆☆(から以下三行あたりまで) のところの動作の意味はわかるんですが なぜchar型でなくてはならないのかが。 知っている方いたら どうか教えてください。 typedef User* PUser; typedef int (*CFT)(const void*, const void*); void ssort(void* base, unsigned int n,        unsigned int sz, CFT cmp) {    for (int i = 0; i < n - 1; i++) for (int j = n - 1; i < j; j--) {          char* pj = (char*)base + j * sz; //←ここ☆☆          char* pj1 = pj - sz;  //とここ☆☆           if (cmp(pj, pj1) < 0) { for (int k = 0; k < sz; k++) { char temp = pj[k]; pj[k] = pj1[k]; pj1[k] = temp; }     }    } /* ssort関数の引数の関数ポインタで 利用される比較関数 */ int cmp1(const void* p, const void* q) { return strcmp(PUser(p)->name, PUser(q)->name); } int cmp2(const void* p, const void* q) { return PUser(p)->dept - PUser(q)->dept; }

  • int main(int argc, char* argv[]) についての質問

    こんにちは.つね日ごろ思っている質問させてください. Cの参考書には, (1) void main(void) { } (2) int main(int argc, char* argv[]) { return 0; } の2つのパターンが記載されていますが, どういう違いがあるのでしょうか? (1)の場合main関数は,型を持たず,引数も持たない. ※Turbo Cなどのコンパイラーでは, return文がないと警告出ます. (2)の場合は,int 型をかえし,引数はint型 変数と char型ポインタ配列(?) を指定している. といったくらいしか分かりません. (2)に関してもう少し述べれば, コマンドラインからファイルを指定し,実行することが できると勉強した記憶があるのですが, 理解があいまいです. 特に(2)の場合のmain関数の意味と,その使い方について アドバイスお願い致します.

  • intやshortやcharの変数確保時間

    for文などでよく一時変数に for ( int i=0; ・・・ とか for ( short s=0; ・・・ とか for ( char i=0; ・・・ みたいに整数型の変数が使われます。 確か変数の表せる範囲は long>int>short>char だったと思うのですが、変数を確保する時間やメモリサイズに違いはあるのでしょうか? たとえばlong型変数を10万個確保する時間とintとかshortとかcharのそれ とは違いがあるのかなぁと疑問に思いました。

  • charで宣言した変数をstringへの代入で

    wchar_t cOrg[128]と宣言している変数にstringで宣言しているstrを cOrg[i] = str[i]; このように代入することはできたのですが、 char cAns[ 128 ]; このように宣言した変数の値をstrの41番目と42番目に 次のように入れようとするとエラーが出ます。 str[41]=cAns[1]; str[42]=cAns[2]; (エラー内容) \Form1.h(428): error C2664: 'System::String::String(wchar_t,int)' : 1 番目の引数を 'wchar_t [128]' から 'wchar_t' に変換できません。(新しい機能 ; ヘルプを参照) このような代入はできないのでしょうか? プログラムの詳細は下のようなものです。 wchar_t cOrg[128],*p; String^ str; String^ str2; int i; int iVal1,iVal2,iTotal = 0,iHosu; char cAns[ 128 ]; str = this->textBox1->Text; for(i=0;i<41;i++) { cOrg[i] = str[i]; } -------(中略)------------------------------------------ iHosu = ~iTotal; // 1の補数 iHosu++; // +1 iHosu = iHosu & 0x00FF; sprintf( cAns, "%s%02X%c", cOrg, iHosu, 0x22 ); str[41]=cAns[1]; str[42]=cAns[2];

  • char型からint型への変換

    char型からint型への変換 char a[6]=3+2-5; int e[6]; (全て0で初期化済) for(i=0;i<6;i++){ if(c[i]=='0'||c[i]=='1'||c[i]=='2'||c[i]=='3'||c[i]=='4'||c[i]=='5'){ e[i]=((int)c[i]-'0'); printf("%d",e[i]); }} for(i=0;i<NUM_DATA;i++){ printf("%d",e[i]); } このプログラムでは上のe[]の出力では「325」と出力されますが、 下のe[]の出力ではめちゃくちゃな数字が出力されてしまいます。 きちんと数字だけを抽出しint型に変換するにはどうしたらいいでしょうか? C言語で行っています。よろしくお願いします。

  • C言語で、文字の出現頻度を求める問題がわかりません

    #include <stdio.h> int main(void) { char ss[80],ascii[128]; int len,i; for(i=0;i<128;i++){ ascii[i]=0; } printf("Input the string : "); scanf("%s",ss); len=strlen(ss); for(i=0;i<len;i++){ ???//その文字のアスキーコードがi番であればascii[i]の値をインクリメント; } for(i=0;i<128;i++){ if(ascii[i]>0){ printf("%c : %5.2f % \n",i,???);//???には出現割合の計算式 } } return 0; } 結果例 入力 aaaa000bbT 出力 a : 40.00% 0 : 30.00% b : 20.00% T : 10.00% ???の部分がわかりません・・・ テストにでるとのことなので焦ってます;;

  • 【C言語】二重forループ内でscanfを使ってchar型変数に数値(

    【C言語】二重forループ内でscanfを使ってchar型変数に数値(%d)を入力すると、きちんとループ処理されないのはなぜ? プログラムを下に用意しましたのでご覧下さい。 二重forループ内で入力を繰り返すプログラムです。 ついでに i j の値を出力するようにしました。 -----------------プログラム---------------- int main (void){ char input = 0; // 入力値 char型にするとforループでインクリメントエラー(int型にすると問題ない) int i = 0, j = 0; , printf("数値を入力して下さい。('-1' で入力終了)\n"); for( i=0 ; i<3 ; i++ ){ // i がちゃんとインクリメントされない for( j=0 ; j<3 ; j++ ){ scanf("%d", &input); // char 型変数に %d で入力すると、i がきちんとインクリメントされない printf("[i][j] = [%d][%d]\n", i, j); if( input == -1 ){ printf("入力を終了します。\n"); break; } } if( input == -1 ) break; } return 0; } ---------------------------------------- ---------実行結果(入力値はchar型)--------- 数値を入力して下さい。('-1' で入力終了) 1 2 3 4 5 6 7 8 9 [i][j] = [0][0] [i][j] = [0][1] [i][j] = [0][2] [i][j] = [0][0] [i][j] = [0][1] [i][j] = [0][2] [i][j] = [0][0] [i][j] = [0][1] [i][j] = [0][2] -1 [i][j] = [16777215][0] 入力を終了します。 ---------------------------------------- ----------実行結果(入力値はint型)---------- 数値を入力して下さい。('-1' で入力終了) 1 2 3 4 5 6 7 8 9 [i][j] = [0][0] [i][j] = [0][1] [i][j] = [0][2] [i][j] = [1][0] [i][j] = [1][1] [i][j] = [1][2] [i][j] = [2][0] [i][j] = [2][1] [i][j] = [2][2] ---------------------------------------- ご覧の通り、char型変数に値を入力しているために、forループで i がきちんとインクリメントされません。 入力値は -128~127 の値しか想定していないので、メモリの消費を少しでも抑えようと思いchar型で宣言したのですが、思わぬ所でおかしな挙動が起こってしまいました。 int型で宣言すればいいだけなのですが、なぜこんな挙動になるのか知りたいです。 よろしくお願いします。

  • C言語のソートの問題なんですが

    値を入力する→値を入力する度に昇順に表示する これを不の値を入力するまで続けるという プログラムを作ろうと思っているのですが #include<stdio.h> swap(int *a,int *b) { int t; t=*a; *a=*b; *b=t; } main() { int i,j,k,a[100]; for(i=0;;++i)  {   scanf("%d",&a[i]);   if(a[i] < 0)    break;   for(j=i+1;;++j)    if(a[i] > a[j])     swap(&a[i],&a[j]);   for(k=0;k <= i;++k)    printf("%d ",a[k]);  }  return 0; } のように書いたのですがjを使った繰り返しの部分でa[j]に 値が無いから動かないと思うのですが どのように直せばいいか分かりません どなたか分かる方御教授お願いします

専門家に質問してみよう