В настоящее время в процессе изучения 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, все портится … Я предполагаю, что это очень простая вещь, и это заставляет меня еще больше расстраиваться, зная, что я ‘ я упускаю что-то действительно очевидное …
Ошибка в вашем коде при первом вызове 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"));
Почему вы используете strcat
когда вам не нужно (как кажется) объединять строки? Вы можете просто сделать:
class Class {
public:
Class(const char* file) {}
// ...
};
int main() {
Class c("filename.file");
Class c2("filename2.file2");
}
или, если вам действительно нужно объединить строки, используйте std::string
вместо const char*
,
std :: string легче манипулировать, автоматически увеличивается в размере и автоматически удаляется. Единственная ошибка в этом случае заключается в том, что класс должен создать свою собственную копию текста, который вы передаете в качестве указателя, потому что, когда строка изменяет данные или выходит из области видимости, указатель становится недействительным.
std::string mystr = "filename.file";
MyClass c(mystr.c_str());
mystr = "filename2"; // reset string
mystr += ".file2" // concatenate
MyClass c2(mystr.c_str());
Если вы написали класс, измените его на использование std :: string.
class MyClass
{
public:
MyClass(const std::string& str_in)
: str(str_in) // initialization list
{
}
std::string str;
};
std::string mystr = "filename.file";
MyClass c(mystr);
mystr = "filename2"; // reset string
mystr += ".file2" // concatenate
MyClass c2(mystr);
Вы должны повторно инициализировать chararr
если вы хотите использовать это так:
char* chararr = new char[2048];
strcpy(chararr,"path\\path2\\");
Class c( strcat(chararr , "filename.file"));
strcpy(chararr,"path\\path2\\");
Class c2( strcat(chararr , "filename2.file2"));
Для этого вы используете c ++, я бы порекомендовал использовать std::string
тем не мение.