ページ 11

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

もちろん、まともに動く可能性はないが。