c语言 - 打印 CString 之前打印未知文本



不幸的是,此代码似乎在打印实际文本之前打印了一些内容。这是怎麽?为什么要打印?

"\300\367\277\357\376">

我在我的代码中更频繁地意识到这一点,我确信这意味着我做错了什么。

char* concat(const char *s1, const char *s2);
int main(int argv, char* args[]){
char lastchars[50];
char *buf;
while(1){
gets(lastchars);
if(strlen(lastchars) == 0)break;
buf = concat(buf, lastchars);
}
printf("%s",buf);
}
char* concat(const char *s1, const char *s2)
{
char *result = malloc(strlen(s1) + strlen(s2) + 1); 
strcpy(result, s1);
strcat(result, s2);
return result;
}

即使我们忽略了对不安全且不再支持的函数gets的调用,此代码也存在许多问题,从您的concat函数开始:

char* concat(const char *s1, const char *s2)
{
char *result = malloc(strlen(s1) + strlen(s2) + 1); 
strcpy(result, s1);
strcat(result, s2);
return result;
}

您用以下行调用concat:当buf未初始化时buf = concat(buf, lastchars);。换句话说:

char *result = malloc(strlen(buf) + strlen(lastwords) + 1);
strcpy(result, buf);
strcat(result, lastwords);
return result;

什么是strlen(buf)?这是未定义的行为,因为buf不包含带有 null 终止符的字符串。

然后,strcpy(result, buf)也是未定义的行为,因为buf未初始化。

然后你返回result并将其重新分配给buf

用这段代码破译你的意图是非常困难的,所以我不能提供解决方案 - 只指出许多问题。

最新更新