- ベストアンサー
C言語で整数を文字列へ型変換
C言語で整数を文字列へ型変換 int result[11]; const char *tmp; resultの中の11個の数字を 1,2,3,4,5,6,7,8,9,10,11 のような文字列にして、tmpへ代入したんですが、やり方が分かりません。 Cの初心者ですので、教えていただきたいです。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
Cでの文字列について、どこまで理解できてますか?他の言語と大分違うので、ちゃんと理解しておきましょう。 配列やポインタが絡んでくるので、なかなかやっかいです。 たとえば char s0[]="abc" ; /* OK */ char* s1="abc" ; /* OK */ s0="abc" ; /* NG */ s1="abc" ; /* OK */ どうしてだかわかりますか?上の4つはすべて違う動作になります。 > const char *tmp; これだと、const(変更不可)なcharへのポインタになるので、ここに「代入」することはできません。 ポインタそのものは変更可能です。 tmp="abc" ; /* tmpの指すアドレスを変更するのでOK */ tmp[0]='D' ; /* 中身を変更することはNG */ また、constを取ったとしても、ポインタは、アドレスを入れるための箱しか作らないので、そのアドレスから値を読み書きできるとは限りません(通常はできません)安全に読み書きするには、そのための領域を確保する必要があります。 tmp = malloc(100) ; /* 99文字+'\0'の100文字分入る領域を確保→使用が終ったらfreeで解放する */ char buff[100] ; /* 配列で領域を確保 */ tmp=buff ; /* ポインタを配列の先頭を指すようにする */ > sprintf(tmp,"%s%d,",tmp, result[i]); この、入出力に同じ領域を使った場合って、保証されてましたっけ?たしか未定義だったような。 sprintfは変換した文字列長を返すので、その分ずつずらすのがよいでしょう。 #1さんのを借りるなら int total_length = 0 ; /* 全文字長 */ int length ; length = sprintf(tmp,"%i",result[0]); total_length += length ; for (i=1; i<11; ++i) length = sprintf(tmp + total_length, ",%i", result[i]); /* 文字列の最後に追加 */ total_length += length ; } あるいは char * tmp0 = tmp ; /* 書き込み先: 最初はtmp */ int length ; length = sprintf(tmp0,"%i",result[0]); tmp0 += length ; /* 文字列分ずらす */ for (i=1; i<11; ++i) length = sprintf(tmp0, ",%i", result[i]); /* 文字列の最後に追加 */ tmp0 += length ; }
その他の回答 (5)
- cats777
- ベストアンサー率0% (0/1)
resultの要素数や要素の桁数に制限については、 記述されていなかったので、特に制限がなくても大丈夫な作りにしてあります。 なお、reallocで失敗したときのことは、考慮してませんので気を付けてください。 こんな感じでどうでしょうか。 void main() { int result[] = { 1,2,3,4,5,6,7,8,9,10,11 }; char* temp = NULL; // データ数 int result_cnt = sizeof( result )/sizeof( int ); // ワーク領域 char wk[12] = { 0 }; // intの最大桁数10桁+","+NULL文字 for( int i = 0 ; i < result_cnt ; i++ ) { // wk領域の初期化 memset( wk, 0x00, sizeof( wk ) ); // wk領域へ変換した文字列をセット itoa( result[i], wk , 10 ); int size1 = ( temp ) ? strlen( temp ) : 0 ; int size2 = strlen( wk ); if( i != result_cnt - 1 ) { wk[ size2 ] = ','; size2 += 1; } temp = (char*)realloc( temp, size1 + size2 + 1 ); memcpy( temp + size1, wk, size2 + 1 ); } printf( "%s\n", temp ); free( temp ); }
- 和泉 博(@hiroshi09s)
- ベストアンサー率54% (59/109)
> resultの中の11個の数字を > 1,2,3,4,5,6,7,8,9,10,11 > のような文字列にして、tmpへ代入したい const char *tmp; は char tmp[32]; の文字配列ということでの回答例です。 sprintf()を使うのは同じなのですが、格納アドレスを offsetでずらしているところが他の回答者と違うところです。 #include <stdio.h> int main(void){ int result[11]={1,2,3,4,5,6,7,8,9,10,11}; char tmp[32]; int j, offset = 0; for(j = 0; j < 11; j++){ offset += sprintf(tmp + offset, j == 0 ? "%d" : ",%d", result[j]); } printf("tmp[]= %s\n", tmp); //文字列tmp を出力 return 0; } /* --- 実行結果 --- tmp[]= 1,2,3,4,5,6,7,8,9,10,11 */
- Tacosan
- ベストアンサー率23% (3656/15482)
今の C だと sprintf の第1引数に restrict がかかるので, 厳密にいうと sprintf(tmp,"%s%d,",tmp, result[i]); はダメなはずです>#3. %n 使ってもいいはずだけど....
- xitoaki
- ベストアンサー率35% (36/101)
Cはごぶさただからなぁ。こんな感じ? for(cnt=0; cnt<sizeof(result); cnt++) { sprintf(tmp,"%s%d,", tmp, result[cnt]); } ちなみに文字列はBASICとかのように直接代入は出来ないので 上のように関数を使ってやるか、 1charずつ書き込むかのどれかしか出来ません。 最後にカンマが余計に付くのが気になるようであれば、 ループ回数を1減らして、最後だけループ外で連結してやればいいかな うまく動くかは試してみて。保障はしないから。
- YanenoSuzume
- ベストアンサー率44% (23/52)
こんな感じかと。 #include <stdio.h> { int i; sprintf(tmp,"%i",result[0]); for (i=1; i<11; ++i) sprintf(tmp,"%s,%i",tmp,result[i]); }