dポイントプレゼントキャンペーン実施中!

C言語で整数を文字列へ型変換
int result[11];
const char *tmp;

resultの中の11個の数字を
1,2,3,4,5,6,7,8,9,10,11
のような文字列にして、tmpへ代入したんですが、やり方が分かりません。

Cの初心者ですので、教えていただきたいです。

A 回答 (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 ;
}
    • good
    • 0

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 );
}
    • good
    • 0

> 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
*/
    • good
    • 0

今の C だと sprintf の第1引数に restrict がかかるので, 厳密にいうと


sprintf(tmp,"%s%d,",tmp, result[i]);
はダメなはずです>#3.

%n 使ってもいいはずだけど....
    • good
    • 0

Cはごぶさただからなぁ。

こんな感じ?

for(cnt=0; cnt<sizeof(result); cnt++)
{
sprintf(tmp,"%s%d,", tmp, result[cnt]);
}

ちなみに文字列はBASICとかのように直接代入は出来ないので
上のように関数を使ってやるか、
1charずつ書き込むかのどれかしか出来ません。

最後にカンマが余計に付くのが気になるようであれば、
ループ回数を1減らして、最後だけループ外で連結してやればいいかな
うまく動くかは試してみて。保障はしないから。
    • good
    • 0

こんな感じかと。



#include <stdio.h>

{
int i;

sprintf(tmp,"%i",result[0]);
for (i=1; i<11; ++i)
sprintf(tmp,"%s,%i",tmp,result[i]);
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!