указатели — новичок с ++; добавление массивов char *?

В настоящее время в процессе изучения 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, все портится … Я предполагаю, что это очень простая вещь, и это заставляет меня еще больше расстраиваться, зная, что я ‘ я упускаю что-то действительно очевидное …

1

Решение

Ошибка в вашем коде при первом вызове 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"));
5

Другие решения

Почему вы используете strcat когда вам не нужно (как кажется) объединять строки? Вы можете просто сделать:

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

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

или, если вам действительно нужно объединить строки, используйте std::string вместо const char*,

3

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);
3

Вы должны повторно инициализировать 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 тем не мение.

3
По вопросам рекламы [email protected]