トップページ > 過去ログ > 記事閲覧
呼び出すたびにcharの長さを可変
名前:ルーイ 日時: 2009/11/22 16:46

例えば Hoge("テスト%d",20); int Hoge(string A,int B){ char Buf[50]; snprintf(Buf,Sizeof(A)+Sizeof(B),A.c_str(),B); } このようなことをしたい時に 引数のstringのサイズを制限しないとBufをオーバーしてしまいます 呼び出すたびにcharの長さを可変にできる何かいい改善策は無いでしょうか? 本当は char Buf[]=A; これっぽいことが出来ればいいのですがコンパイルエラーになってしまいます、、

Page: 1 |

Re: 呼び出すたびにcharの長さを可変 ( No.1 )
名前:white 日時:2009/11/22 17:23

可変にしたいという事でしたら Hoge関数内で引数のBの値か、string Aのサイズを元に malloc(またはnew)や、calloc関数等で動的に領域を 確保して使用すれば良いのではないでしょうか。 解放するタイミングは少し気をつけないといけないけれど。
Re: 呼び出すたびにcharの長さを可変 ( No.2 )
名前:いっち 日時:2009/11/22 18:00

whiteさんの仰るとおり実行時にバッファのサイズを決めるのであれば、 new演算子やmalloc関数を使うのが一般的と思われます。 例えば以下のようになります。 int func( char *s1, char *s2 ) { char *buff = new char[strlen(s1)+strlen(s2)+1]; // バッファの確保 int n; sprintf( buff, "%s%s" s1, s2 ); n = atoi( buff ); delete [] buff; return n; // バッファの開放 } 余談ですが、ルーイさんのsizeof()の使い方が気になります。 (Sが大文字なので独自の関数だとしたら余計なお世話です。すみません) stringクラスはsizeof演算子では文字列の長さが取れません。 length()メンバ関数を使用する必要があります。 また、sizeof(B)としても帰ってくる値はおそらく 4 だと思います。 int型を10進整数の文字列に変換する場合、最大文字数は10文字です。 (符号がつくならさらに+1) ですので、snprintf関数に渡す値としてSizeof(A)+Sizeof(B)というのは不適当と思われます。 (最大文字数を指定するだけなので問題があるとは言い切れませんが。) また、printfなどのフォーマット系では、sprintf( s, "%50d", i)などの使い方をした場合、 50文字分の領域が必要になることにも注意が必要です。
Re: 呼び出すたびにcharの長さを可変 ( No.3 )
名前:ルーイ 日時:2009/11/22 23:21

すばやい回答ありがとうございます! 返答が遅れてすみません>< char *buff = new char[strlen(s1)+strlen(s2)+1]; こういう使い方もあるのかと感動しましたw ありがとうございます!! sizeofに関しては元ソースを見て概略して書いたので、記述ミスです 指摘ありがとうございます、w

Page: 1 |