不幸的是,此代码似乎在打印实际文本之前打印了一些内容。这是怎麽?为什么要打印?
"\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
。
用这段代码破译你的意图是非常困难的,所以我不能提供解决方案 - 只指出许多问题。