No.15176![]() |
sprintfについて 投稿者---MO(2004/07/03 15:53:04) |
||
buf配列に 0, 16, 32, 64, 128, 256, 512, 1024 とカンマを入れて 格納しようとしているのですが上手くいきません。 どうすればいいでしょうか? #include<stdio.h> #include<cstdio> void main(void) { int data[] = {0, 16, 32, 64, 128, 256, 512, 1024}; int n = sizeof(data) / sizeof(int); char buf[256]; int i; buf[0] = '\0'; for(i = 0; i < n - 1; i++){ sprintf(buf, "%s%d,",buf, data[i]); } sprintf(buf, "%s%d",buf, data[i]); printf("%s\n",buf); } |
No.15178![]() |
Re:sprintfについて 投稿者---かずま(2004/07/03 16:07:25) |
||
> buf配列に 0, 16, 32, 64, 128, 256, 512, 1024 とカンマを入れて > 格納しようとしているのですが上手くいきません。 > どうすればいいでしょうか? #include <stdio.h> int main(void) { int data[] = {0, 16, 32, 64, 128, 256, 512, 1024}; const int n = sizeof(data) / sizeof(int); char buf[256]; int i, j; j = sprintf(buf, "%d", data[0]); for (i = 1; i < n; i++) j += sprintf(buf + j, ", %d", data[i]); puts(buf); return 0; } |
No.15184![]() |
Re:sprintfについて 投稿者---MO(2004/07/03 22:31:09) |
||
かずまさんの上記の記述、sprintfの戻り値を 利用することで完成していますが、 私の記述したソースでは理論的には間違って いないと思うのですが、なぜbufにキチンと 格納されないのでしょうか? for(i = 0; i < n - 1; i++){ sprintf(buf, "%s%d,",buf, data[i]); ここで前回までのbuf+data[i]で 更新をかけているのですが 今回格納する値しか残りません。 } sprintf(buf, "%s%d",buf, data[i]); 最終的にここに格納する値だけがbufの 値となる。 |
No.15186![]() |
Re:sprintfについて 投稿者---YuO(2004/07/03 22:52:00) |
||
>私の記述したソースでは理論的には間違って >いないと思うのですが、なぜbufにキチンと >格納されないのでしょうか? 間違っています。 sprintfにおいて,領域の重なり合うオブジェクト間でのコピーは, 元々未定義動作とされています。 MOさんのようなコードを書いた以上,何が起こるかわからない,ということになります。 |
No.15187![]() |
Re:sprintfについて 投稿者---あかま(2004/07/03 23:00:29) |
||
重なり合う文字列間でコピーした場合の動作は未定義なのでそういう動作をしたのでしょう。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_crt_sprintf.2c_.swprintf.asp ↓のようなめんどくさいことをすればうまくいきます。 #include<stdio.h> #include<cstdio> void main(void) { int data[] = {0, 16, 32, 64, 128, 256, 512, 1024}; int n = sizeof(data) / sizeof(int); char buf[256],buf2[256]; int i; buf2[0] = buf[0] = '\0'; for(i = 0; i < n - 1; i++){ sprintf(buf, "%s%d,",buf2, data[i]); strcpy(buf2,buf); } sprintf(buf, "%s%d",buf2, data[i]); printf("%s\n",buf); } |
No.15192![]() |
Re:sprintfについて 投稿者---MO(2004/07/04 11:19:21) |
||
>重なり合う文字列間でコピーした場合の動作は未定義なのでそういう どうも、調べていただいてありがとうございます。 記述されていたソースにも納得しました。 本当にありがとうございます。 |