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 所以我第二次这样做时,使用 Class c2,一切都搞砸了......我猜这是一个非常非常基本的事情,它让我更加沮丧知道我'我错过了一些非常明显的东西......

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 回答
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);
于 2013-07-22T16:49:20.553 回答
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

于 2013-07-22T16:50:13.323 回答