C言語関係掲示板

過去ログ

No.1166 sprintfについて

[戻る] [ホームページ]
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)


>重なり合う文字列間でコピーした場合の動作は未定義なのでそういう
どうも、調べていただいてありがとうございます。
記述されていたソースにも納得しました。
本当にありがとうございます。