よろしくお願いします。
sprintf関数を使い変数に文字を入れているのですが
ヌル文字を途中で入れるとそこまでしか代入されず困っています。
ソースは以下の通りです。
char c[1024] = "";
int a = 10;
sprintf(c,"あいうえお\0かきくけこ%d",a);
このままだとあいうえおまでしか入らずカ行が代入されません。
実際にはTCHAR型を使い、sprintfの代わりに_stprintfを使用していますが・・・
ファイル操作のOPENFILENAMEメンバlpstrFilterに指定するためにどうしても
ヌル文字で区切る必要があります。
こんな質問でいいのかわかりませんがよろしくお願いします。
sprintf()でのヌル文字の指定
Re:sprintf()でのヌル文字の指定
文字列を操作する関数は、基本的に'\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()でのヌル文字の指定
別々にいれてみてはどうですか?
#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()でのヌル文字の指定
%c変換を使う。
2回に分けるなら、sprintfの戻り値を使おうよ。
sprintf(c,"あいうえお%cかきくけこ%d", 0, a);フリオさん、Dixqさんへ、
2回に分けるなら、sprintfの戻り値を使おうよ。
len = sprintf(c,"あいうえお")+1;
Re:sprintf()でのヌル文字の指定
>>hogeさん
なるほど~!確かにそうすれば出来ますね。
ホントにプログラムってクイズですねw
ちょっと回答に魅力を感じてしまいました^^
後仰るようにsprintfの返り値使った方がよかったですね。
なるほど~!確かにそうすれば出来ますね。
ホントにプログラムってクイズですねw
ちょっと回答に魅力を感じてしまいました^^
後仰るようにsprintfの返り値使った方がよかったですね。
Re:sprintf()でのヌル文字の指定
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()でのヌル文字の指定
みなさんありがとうございます。
考えた結果こんな感じになりました。
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つつけています。
たくさんの回答ありがとうございました。
考えた結果こんな感じになりました。
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()でのヌル文字の指定
> 環境書かれていないけどそのソースでコンパイルとおるんですか?
sprintfの引数の数が異なるので、コンパイルを通すには <stdio.h> をインクルードしない以外にはあり得ません(もちろん未定義の動作になります)。
> 戻り値がchar*のsprintfって何?(私が無知なだけですか?)
<stdio.h>をインクルードしてもしなくても、sprintfの返却型はintですね。
int型の値はchar*に代入することができます(コンパイルできます)。
もちろん、この場合にまともに動く可能性はありません。
sprintfの引数の数が異なるので、コンパイルを通すには <stdio.h> をインクルードしない以外にはあり得ません(もちろん未定義の動作になります)。
> 戻り値がchar*のsprintfって何?(私が無知なだけですか?)
<stdio.h>をインクルードしてもしなくても、sprintfの返却型はintですね。
int型の値はchar*に代入することができます(コンパイルできます)。
もちろん、この場合にまともに動く可能性はありません。
Re:sprintf()でのヌル文字の指定
> 戻り値がchar*のsprintfって何?(私が無知なだけですか?)
そういう処理系が規格化以前にはあったようです。
http://www.geocities.jp/fut_nis/html/au ... ility.html
もちろん、まともに動く可能性はないが。
そういう処理系が規格化以前にはあったようです。
http://www.geocities.jp/fut_nis/html/au ... ility.html
もちろん、まともに動く可能性はないが。