文字列の右から20文字を切り取り、ある関数に切り取った文字のポインタを
渡したいと思っています。
このやり方でもいいのですが、
CStringを2回宣言する必要があるなど、無駄な処理が
多くなります。もっとシンプルにできたらいいのですが。。。
もっと簡単なやり方をご存知な方は、ご教授ください。
Func(char *_File)
{
// 文字列
CString Str( _File );
CString Buff;
Buff = Str.Right(20);
Func2( Buff.GetBuffer(0) );
}
開発環境 VC++,MFC
こんな感じ?
void Func(char *_File)
{
// 文字列
Func2(&_File[strlen(_File)-20]);
}
あと、GetBufferしたらReleaseBufferしましょう。
Func(char *_File)
{
// 文字列
CString Buff(_File).Right(20);
Func2( Buff.GetBuffer(0) );
}
これ以上、シンプルにならない気もしますが・・・
あ・・・
CStringは使わなくていいのね・・・
Func2に渡したchar*を使って何をしているか
明確でないのでなんともいえませんが、
もし_Fileの文字列を保持しておく必要があり、
Func2内で渡された文字列を変更するならば、
>Func2(&_File[strlen(_File)-20]);
は、ちょっとまずいですね。
でも、
void Func(const char *_File)じゃなくて
void Func(char *_File)だから、いいのかな?
NEG(ねぐ)さん、Xさん、とおりすがりさん、ありがとうございます。
基本的にMFCは、使わない方法でやりたいので、
理由は、MFCを使わないほうが、処理速度が速いと思ったからです。
もっと複雑なポインタ位置の計算が必要なのかと思ってました。
すごく単純でいいですね。こんな感じにしようと思います。
>とおりすがりさん
ファイルに書き出す文字列を制限したいだけなので、
大丈夫です。ありがとうございます。
void Func(char *_File)
{
// 文字列(終端コード用に1つ多いサイズ)
char str[21];
// 右から20文字を切り出す
memcpy(str, &_File[strlen(_File)-20], sizeof(str) );
// 関数への引渡し
Func2( str );
//↑ここでは、文字列をファイルに書き出している
}
引数char *_Fileの文字列長が20文字より小さい場合、
文字列の先頭より前の領域からmemcpyしてしまいます。
呼び出し側で制御して、
関数に20文字より小さい文字列が渡されないのであれば問題無いと思いますが、
そうでないならば、文字列長をチェックしてやる必要があると思います。
長さをチェックするようにします。
ありがとうございました。