C++ C++;-我已经分配了一个字符数组,内容是`;B
我想连接两个常量字符*但当我这样做时,我得到了以下符号:`�b 我做了以下工作:C++ C++;-我已经分配了一个字符数组,内容是`;B,c++,char,C++,Char,我想连接两个常量字符*但当我这样做时,我得到了以下符号:`�b 我做了以下工作: char* path = new char[strlen(args->targetFileName) + strlen(args->targetFilePath)]; cout << path << endl; strcat(path,args->targetFilePath); cout << path << endl; strcat(path,
char* path = new char[strlen(args->targetFileName) + strlen(args->targetFilePath)];
cout << path << endl;
strcat(path,args->targetFilePath);
cout << path << endl;
strcat(path,args->targetFileName);
cout << path << endl;
什么毛病??有什么建议吗?您还没有初始化
路径
变量。您已经为它分配了内存,但它最初只包含垃圾,它碰巧有一个空值。然后连接字符串,以便将路径追加到垃圾中。用strcpy
替换第一个strcat
,您应该是对的。您还没有初始化路径
变量。您已经为它分配了内存,但它最初只包含垃圾,它碰巧有一个空值。然后连接字符串,以便将路径追加到垃圾中。将第一个strcat替换为strcpy,您应该是对的。数组包含未初始化的内存。您的strcat
正在搜索第一个0
字节,无法保证它在哪里,或者是否有(在这种情况下,strcat
甚至会搜索分配的内存,可能将调用的UB作为崩溃体现)
在使用<代码> STRCAT/CODE>时,将第一个字节设置为<代码> 0代码>,或者更好的是,使用C++并使用<代码> STD::String > /P> < P>数组包含未初始化的内存。您的
strcat
正在搜索第一个0
字节,无法保证它在哪里,或者是否有(在这种情况下,strcat
甚至会搜索分配的内存,可能将调用的UB作为崩溃体现)
在使用<代码> STARCAT/COD>时,将第一个字节设置为<代码> 0代码>,或者更好地使用C++,使用<代码> STD::String .< /P> < P> <强>学习使用调试器< /String >(如Linux上的代码> GDB < /C> >,并要求编译器发出所有警告(如Linux上的代码> G++-WALL-G/<代码>)。 您已分配但未填充数组。也许试试吧
size_t targetfilenamelen = strlen(args->targetFileName);
size_t targetfilepathlen = strlen(args->targetFilePath);
char* path = new char[targetfilenamelen+targetfilepathlen+1]; // extra zero byte
strcpy (path, args->targetFileName);
strcat (path, args->targetFilePath);
更好的方法是使用std::string
std::string name(args->targetFileName);
std::string path(args->targetFilePath);
std::string res = name+path;
学习使用调试器(如Linux上的
gdb
),并要求编译器发出所有警告(如Linux上的g++-Wall-g
)
您已分配但未填充数组。也许试试吧
size_t targetfilenamelen = strlen(args->targetFileName);
size_t targetfilepathlen = strlen(args->targetFilePath);
char* path = new char[targetfilenamelen+targetfilepathlen+1]; // extra zero byte
strcpy (path, args->targetFileName);
strcat (path, args->targetFilePath);
更好的方法是使用std::string
std::string name(args->targetFileName);
std::string path(args->targetFilePath);
std::string res = name+path;
为什么不使用
std::string
s?看起来像是unicode问题..?不,cstring中只是垃圾,因为它没有初始化。由于这个问题,请参阅Chris Parton&Plasmah。非托管语言应该始终初始化新变量。为什么不使用std::string
s?看起来像是unicode问题..?不,cstring中只是垃圾,因为它没有初始化。因为这个问题,请参阅Chris Parton&Plasmah。非托管语言应该总是初始化新变量。不用担心,我们都曾在某个时候犯过这样的错误:)我真的需要睡觉了,但堆栈溢出会让人上瘾!不用担心,我们都犯过这样的错误:)我真的需要上床睡觉了,但是堆栈溢出会让人上瘾!