1

現在、C ++を学習している最中ですが、今は本当にイライラしているためかもしれませんが、単純な小さな頭をこれに巻き付けることができないようです:

クラスコンストラクターがあります:

Class (const char* file); 

メインクラスでは次のように使用します。

char* chararr = new char[2048]; 
//stuff with charrarr
// std::cout << chararr would be: "C:\stuff\paths\etc\"
Class c( strcat(chararr , "filename.file"));
//I want it to be: "C:\stuff\paths\etc\filename.file
Class c2( strcat(chararr , "filename2.file2"));
////I want this to be: "C:\stuff\paths\etc\filename2.file2" but it is instead
// "C:\stuff\paths\etc\filename.filefilename2.file"

問題は、strcat が chararr を変更するため、クラス c2 で 2 回目にこれを行うと、すべてがめちゃくちゃになることです...これは非常に基本的なことだと思います。本当に明白な何かが欠けています...

4

4 に答える 4

5

最初に呼び出す必要があるコードのエラーstrcpy()ですが、ガベージと連結しています。

Class c( strcpy(chararr , "filename.file"));

そうしないと、ガベージ、未定義の動作が連結されます。

編集:

// std::cout << chararr would be: "C:\stuff\paths\etc\"
size_t len = strlen(chararr);  // <--- notice
Class c( strcat(chararr , "filename.file"));
// path\path2\filename.file
//            ^ replace `f` with '\0'          
chararr[len] = '\0'; // <--- notice
Class c2( strcat(chararr , "filename2.file2"));
于 2013-07-22T16:23:01.670 に答える
3

strcat文字列を連結する必要がない (ように見える) のに、なぜ使用しているのですか? あなたは単に行うことができます:

class Class {
public:
    Class(const char* file) {}
    // ...
};

int main() {
    Class c("filename.file");
    Class c2("filename2.file2");
}

または、本当に文字列を連結する必要がある場合は、std::string代わりにconst char*.

于 2013-07-22T16:26:24.387 に答える