sprintf()でのヌル文字の指定

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ママ

sprintf()でのヌル文字の指定

#1

投稿記事 by ママ » 17年前

よろしくお願いします。
sprintf関数を使い変数に文字を入れているのですが
ヌル文字を途中で入れるとそこまでしか代入されず困っています。
ソースは以下の通りです。

char c[1024] = "";
int a = 10;
sprintf(c,"あいうえお\0かきくけこ%d",a);

このままだとあいうえおまでしか入らずカ行が代入されません。
実際にはTCHAR型を使い、sprintfの代わりに_stprintfを使用していますが・・・
ファイル操作のOPENFILENAMEメンバlpstrFilterに指定するためにどうしても
ヌル文字で区切る必要があります。

こんな質問でいいのかわかりませんがよろしくお願いします。

フリオ

Re:sprintf()でのヌル文字の指定

#2

投稿記事 by フリオ » 17年前

 
 文字列を操作する関数は、基本的に'\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;
}

でどうでしょう。
 

Dixq (管理人)

Re:sprintf()でのヌル文字の指定

#3

投稿記事 by Dixq (管理人) » 17年前

別々にいれてみてはどうですか?
#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
 

Dixq (管理人)

Re:sprintf()でのヌル文字の指定

#4

投稿記事 by Dixq (管理人) » 17年前

う、すみません。こんな時間だから大丈夫だろうと思っていると被ってしまった^^;

hoge

Re:sprintf()でのヌル文字の指定

#5

投稿記事 by hoge » 17年前

%c変換を使う。
sprintf(c,"あいうえお%cかきくけこ%d", 0, a);
フリオさん、Dixqさんへ、
2回に分けるなら、sprintfの戻り値を使おうよ。
len = sprintf(c,"あいうえお")+1;

Dixq (管理人)

Re:sprintf()でのヌル文字の指定

#6

投稿記事 by Dixq (管理人) » 17年前

>>hogeさん

なるほど~!確かにそうすれば出来ますね。
ホントにプログラムってクイズですねw
ちょっと回答に魅力を感じてしまいました^^

後仰るようにsprintfの返り値使った方がよかったですね。

たかぎ

Re:sprintf()でのヌル文字の指定

#7

投稿記事 by たかぎ » 17年前

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()でのヌル文字の指定

#8

投稿記事 by ママ » 17年前

みなさんありがとうございます。
考えた結果こんな感じになりました。

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つつけています。
たくさんの回答ありがとうございました。

Mist

Re:sprintf()でのヌル文字の指定

#9

投稿記事 by Mist » 17年前

環境書かれていないけどそのソースでコンパイルとおるんですか?
戻り値がchar*のsprintfって何?(私が無知なだけですか?)

たかぎ

Re:sprintf()でのヌル文字の指定

#10

投稿記事 by たかぎ » 17年前

> 環境書かれていないけどそのソースでコンパイルとおるんですか?

sprintfの引数の数が異なるので、コンパイルを通すには <stdio.h> をインクルードしない以外にはあり得ません(もちろん未定義の動作になります)。

> 戻り値がchar*のsprintfって何?(私が無知なだけですか?)

<stdio.h>をインクルードしてもしなくても、sprintfの返却型はintですね。
int型の値はchar*に代入することができます(コンパイルできます)。
もちろん、この場合にまともに動く可能性はありません。

hoge

Re:sprintf()でのヌル文字の指定

#11

投稿記事 by hoge » 17年前

> 戻り値がchar*のsprintfって何?(私が無知なだけですか?)

そういう処理系が規格化以前にはあったようです。
http://www.geocities.jp/fut_nis/html/au ... ility.html

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

閉鎖

“C言語何でも質問掲示板” へ戻る