strcat两次添加第二个参数

时间:2013-05-30 12:45:41

标签: c++ windows codeblocks strcat

class Vars{
    public:
    char *appData = getenv("AppData");
    string datadir = strcat(appData, "\\Bob");
};


cout << v.datadir; 

输出"C:\Users\Adam\AppData\Roaming\Bob\Bob"

而不是“C:\Users\Adam\AppData\Roaming\Bob"

它总是两次添加第二个参数。怎么样?

2 个答案:

答案 0 :(得分:2)

&#34;该函数返回的指针所指向的字符串不应被程序修改。&#34;像你一样改变值(通过strcat)会导致不可预测的行为。解决方案是将不可变的给定字符串复制到string并在那里进行连接。

如何创建一个新的公共函数来执行此操作:

string datadir(getenv("AppData"));
datadir += "\\Bob";

这是前C ++ 11代码。

答案 1 :(得分:1)

问题是你正在修改你不应该的内存。你得到一个来自getenv的指针,但那是指向你无法控制的记忆(强调我的)。

  

返回的指针指向内部存储器块,其内容或有效性可能通过进一步调用getenv而改变(但不能通过其他库函数调用)。

     

该函数返回的指针指向的字符串不应被程序修改。某些系统和库实现可能允许使用特定函数(putenv,setenv ...)更改环境变量,但此类功能是不可移植的。

通过调用strcat(appData, "\\Bob");,您正在将\Bob写入您无法控制的内存中。操作系统可以决定用它做任何事情。正如@Liviu已经指出的那样,最好是复制原始值并附加到它。

std::string appData( getEnv("AppData" ) );
appData += "\\Bob";