ページ 1 / 1
sprintf()でのヌル文字の指定
Posted: 2008年10月29日(水) 04:52
by ママ
よろしくお願いします。
sprintf関数を使い変数に文字を入れているのですが
ヌル文字を途中で入れるとそこまでしか代入されず困っています。
ソースは以下の通りです。
char c[1024] = "";
int a = 10;
sprintf(c,"あいうえお\0かきくけこ%d",a);
このままだとあいうえおまでしか入らずカ行が代入されません。
実際にはTCHAR型を使い、sprintfの代わりに_stprintfを使用していますが・・・
ファイル操作のOPENFILENAMEメンバlpstrFilterに指定するためにどうしても
ヌル文字で区切る必要があります。
こんな質問でいいのかわかりませんがよろしくお願いします。
Re:sprintf()でのヌル文字の指定
Posted: 2008年10月29日(水) 05:58
by フリオ
文字列を操作する関数は、基本的に'\0'で終端するようになっているので、
それを超えての操作は出来ないと思います。
"sprintf"を使うなら、2回に分けて、
#include <stdio.h>
#include <string.h>
int main(void)
{
char c[1024] = "", *p;
int a = 10, i;
sprintf(c,"あいうえお");
p = c + strlen(c) + 1;
sprintf(p,"かきくけこ%d",a);
for(i = 0; i < 24; i ++){
if(!c) printf("\\0");
else putchar(c);
}
return 0;
}
でどうでしょう。
Re:sprintf()でのヌル文字の指定
Posted: 2008年10月29日(水) 06:00
by Dixq (管理人)
別々にいれてみてはどうですか?
#include <stdio.h>
#include <string.h>
int main(void){
char c[1024];
int a = 10,len;
sprintf(&c[0],"あいうえお");
sprintf(&c[len=(strlen(c)+1)],"かきくけこ%d",a);
printf("%s%s",&c[0],&c[len]);
return 0;
}
実行結果
あいうえおかきくけこ10
Re:sprintf()でのヌル文字の指定
Posted: 2008年10月29日(水) 06:01
by Dixq (管理人)
う、すみません。こんな時間だから大丈夫だろうと思っていると被ってしまった^^;
Re:sprintf()でのヌル文字の指定
Posted: 2008年10月29日(水) 13:47
by hoge
%c変換を使う。
sprintf(c,"あいうえお%cかきくけこ%d", 0, a);
フリオさん、Dixqさんへ、
2回に分けるなら、sprintfの戻り値を使おうよ。
len = sprintf(c,"あいうえお")+1;
Re:sprintf()でのヌル文字の指定
Posted: 2008年10月29日(水) 15:02
by Dixq (管理人)
>>hogeさん
なるほど~!確かにそうすれば出来ますね。
ホントにプログラムってクイズですねw
ちょっと回答に魅力を感じてしまいました^^
後仰るようにsprintfの返り値使った方がよかったですね。
Re:sprintf()でのヌル文字の指定
Posted: 2008年10月29日(水) 15:43
by たかぎ
const char s[/url] = "あいうえお\0かきくけこ";
char c[1024];
int a = 10;
memcpy(c, s, sizeof(s)-1);
sprintf(c + sizeof(s)-1, "%d", a);
これでもOKです。
Re:sprintf()でのヌル文字の指定
Posted: 2008年10月29日(水) 17:57
by ママ
みなさんありがとうございます。
考えた結果こんな感じになりました。
char c[512];
char* p=c;
int a=10,b=20;
p = sprintf("あいうえお")+1;
p = sprintf("かきくけこ%d",a)+1;
p = sprintf("さしすせそ%d",b)+1;
p = sprintf("")+1;
ファイル操作なので最後にヌル文字を2つつけています。
たくさんの回答ありがとうございました。
Re:sprintf()でのヌル文字の指定
Posted: 2008年10月29日(水) 18:18
by Mist
環境書かれていないけどそのソースでコンパイルとおるんですか?
戻り値がchar*のsprintfって何?(私が無知なだけですか?)
Re:sprintf()でのヌル文字の指定
Posted: 2008年10月29日(水) 20:01
by たかぎ
> 環境書かれていないけどそのソースでコンパイルとおるんですか?
sprintfの引数の数が異なるので、コンパイルを通すには <stdio.h> をインクルードしない以外にはあり得ません(もちろん未定義の動作になります)。
> 戻り値がchar*のsprintfって何?(私が無知なだけですか?)
<stdio.h>をインクルードしてもしなくても、sprintfの返却型はintですね。
int型の値はchar*に代入することができます(コンパイルできます)。
もちろん、この場合にまともに動く可能性はありません。
Re:sprintf()でのヌル文字の指定
Posted: 2008年10月29日(水) 21:27
by hoge
> 戻り値がchar*のsprintfって何?(私が無知なだけですか?)
そういう処理系が規格化以前にはあったようです。
http://www.geocities.jp/fut_nis/html/au ... ility.html
もちろん、まともに動く可能性はないが。