- 締切済み
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; }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
#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)
突っ込みどころ満載ですが、とりあえず、最も重篤な部分を三点だけ指摘します。 > str.erase(str.find_last_of('.')+1); find_last_ofは、探索に失敗すると、str.end()を返すので、返却値をちゃんと調べないと動作が未定義になります。 > file = strcat(str, ex); strcatの第一引数はchar*なので、string型であるstrを渡すことはできません。 また、string型を使っているにもかかわらず、<string>ヘッダがインクルードされていません。 上記を直したからといって、期待通りに動くかどうかは知りませんが、少なくともこのままではだめです。 ところで、今回貼られたソースでは、どこにもSTLが使われていないようですが...