• 締切済み

C++でSTLを使った文字列操作

C++素人です。 第一引数で指定するファイルパスの 拡張子を.datに変更する関数を作っていますがうまくいきません。 STLの使い方が悪いのでしょうか? #include <string.h> using namespace std; char *exchange(const char *fname) { char *file; char *ex; string str; str = fname; ex = ".dat"; str.erase(str.find_last_of('.')+1); file = strcat(str, ex); return file; } int main(int argc, char *argv[]) { char *file = exchange(argv[1]); return 0; }

みんなの回答

回答No.2

#include <iostream> #include <string> std::string replace_ext(const std::string& input) { return input.substr(0,input.rfind('.')).append(".dat"); } int main(int, char* argv[]) { std::cout << "trial" << '>' << replace_ext("trial") << std::endl; std::cout << "trial." << '>' << replace_ext("trial.") << std::endl; std::cout << "trial.txt" << '>' << replace_ext("trial.txt") << std::endl; }

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

突っ込みどころ満載ですが、とりあえず、最も重篤な部分を三点だけ指摘します。 > str.erase(str.find_last_of('.')+1); find_last_ofは、探索に失敗すると、str.end()を返すので、返却値をちゃんと調べないと動作が未定義になります。 > file = strcat(str, ex); strcatの第一引数はchar*なので、string型であるstrを渡すことはできません。 また、string型を使っているにもかかわらず、<string>ヘッダがインクルードされていません。 上記を直したからといって、期待通りに動くかどうかは知りませんが、少なくともこのままではだめです。 ところで、今回貼られたソースでは、どこにもSTLが使われていないようですが...

関連するQ&A