C++ C++;-我已经分配了一个字符数组,内容是`࿽;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,

我想连接两个常量字符*但当我这样做时,我得到了以下符号:`�b

我做了以下工作:

 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。非托管语言应该总是初始化新变量。不用担心,我们都曾在某个时候犯过这样的错误:)我真的需要睡觉了,但堆栈溢出会让人上瘾!不用担心,我们都犯过这样的错误:)我真的需要上床睡觉了,但是堆栈溢出会让人上瘾!