![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
No.3ベストアンサー
- 回答日時:
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 ;
}
No.6
- 回答日時:
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 );
}
No.5
- 回答日時:
> 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
*/
No.4
- 回答日時:
今の C だと sprintf の第1引数に restrict がかかるので, 厳密にいうと
sprintf(tmp,"%s%d,",tmp, result[i]);
はダメなはずです>#3.
%n 使ってもいいはずだけど....
No.2
- 回答日時:
Cはごぶさただからなぁ。
こんな感じ?for(cnt=0; cnt<sizeof(result); cnt++)
{
sprintf(tmp,"%s%d,", tmp, result[cnt]);
}
ちなみに文字列はBASICとかのように直接代入は出来ないので
上のように関数を使ってやるか、
1charずつ書き込むかのどれかしか出来ません。
最後にカンマが余計に付くのが気になるようであれば、
ループ回数を1減らして、最後だけループ外で連結してやればいいかな
うまく動くかは試してみて。保障はしないから。
No.1
- 回答日時:
こんな感じかと。
#include <stdio.h>
{
int i;
sprintf(tmp,"%i",result[0]);
for (i=1; i<11; ++i)
sprintf(tmp,"%s,%i",tmp,result[i]);
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 int temp = 0; if(isdigit(arr[i])){ temp=arr[i] 2 2022/03/27 01:44
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- その他(プログラミング・Web制作) 変換のプログラムを教えてください。 6 2023/07/01 09:57
- C言語・C++・C# int temp = 0; if(isdigit(arr[i])){//文字が数字であれば(0~9) 1 2022/03/27 01:37
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- Visual Basic(VBA) VBAで、特定の文字より後を削除して残った数値を文字列に変換と特定の文字より前も削除したい 3 2022/04/15 19:21
- PHP c言語 文字 - '1'+26 3 2022/03/26 20:58
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
小数点入りの文字列をfloat型に...
-
C言語にて構造体のメンバがNULL...
-
char*を初期化したいのですが
-
csvファイルをfscanfで読み込む...
-
ポインタ配列
-
const char* s1とただのchar s1...
-
fread()関数とfwrite()関数につ...
-
ポインタを使って回文かどうか...
-
'\\0'とはなんですか?
-
c言語でポインタ変数を用いた配...
-
strcat関数を自作したいです
-
char 文字列型 の表現範囲が-12...
-
Run-Timeエラーの原因に関して...
-
ASCIIコードへの変換方法
-
VC++6.0にて、文字列処理にて困...
-
fstream型オブジェクトを関数の...
-
charポインタへの文字列による...
-
char AA[]{"全角文字"};から"全...
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のintとcharの違いってな...
-
char*を初期化したいのですが
-
C言語にて構造体のメンバがNULL...
-
CStringからchar*への型変換に...
-
strcat関数を自作したいです
-
new charとnew char[N]の違いは?
-
csvファイルをfscanfで読み込む...
-
char型にint型の数値を代入する。
-
動的メモリの初期化方法について。
-
C言語で文字列をかえす正しい書...
-
文字列str内の全ての数字を...
-
char 文字列型 の表現範囲が-12...
-
DWORDとcharの変換
-
fstream型オブジェクトを関数の...
-
小数点入りの文字列をfloat型に...
-
C言語のプログラムについてです
-
const char* s1とただのchar s1...
-
文字列内の数字削除
-
c言語でポインタ変数を用いた配...
-
szとlpszの違い
おすすめ情報