【问题标题】:newbie c++; adding char* arrays?新手 C++;添加 char* 数组?
【发布时间】:2013-07-22 16:20:52
【问题描述】:

目前正在学习 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,一切都搞砸了......我猜这是一个非常非常基本的事情,它让我更加沮丧知道我错过了一些非常明显的东西......

【问题讨论】:

  • 你知道你可以简单地说Class c("filename.file");吗?
  • 你需要一个复制构造函数来深度复制char *
  • 你也在 strcating 一个未初始化的数组 - 看看这个 - stackoverflow.com/questions/8311942/…
  • 如果您使用的是 MS Visual C++,请单击函数名称(例如 strcat)并按 F1 获取帮助,包括相关函数。如果您使用的是 Linux,cplusplus.comlinux.die.net/man
  • 如果您正在编写 Class,请考虑修改它以接受 std::string 而不是 const char*,以避免自己管理内存。

标签: c++ pointers char strcat


【解决方案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"));

【讨论】:

  • 为什么不简单地Class c("filename.file")strcpy() 在这里有什么用处?
  • @g-makulik 我只是在告诉他错误
  • 我想我解释错了,charrarr 不是一个空数组。这是一个 char* 数组,如下所示:“path\path2\”,因此 c 为:path\path2\filename.file”,c2 为“path\path2\filename2.file”,我已使用更详细的解释
  • @optional 然后第二个将是"path\path2\filename.filefilename2.file"
  • 是的,那是我的问题! :(
【解决方案2】:

当您不需要(看起来)连接字符串时,为什么要使用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);
    

    【讨论】:

      【解决方案4】:

      如果你想这样使用它,你必须重新初始化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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-07
        • 1970-01-01
        • 2018-04-14
        • 2022-01-10
        • 1970-01-01
        • 2017-06-06
        相关资源
        最近更新 更多