我正在努力学习C.所以我挑战自己创建一个名为two()
的函数,它将有效地“加倍”一个字符串。
two("foo") // => "foofoo"
但是我在将strcat()
与指针结合使用时遇到了麻烦。这就是我所拥有的:
char *two(char *foo);
int main() {
printf("The value of two(\"foo\") is %s", two("foo"));
}
char *two(char *foo) {
return strcat(foo, foo);
}
它编译但运行时出错。为什么呢?
我感觉错误在于使用带有指针字符串的strcat
。
答案 0 :(得分:7)
您正在打破strcat
的多个规则:
答案 1 :(得分:4)
文档说strcat
将源字符串的副本附加到目标字符串。目标中的终止空字符被源的第一个字符覆盖,并且在由目标中的两个串联形成的新字符串的末尾包含空字符。\
您将常量字符串"foo"
传递给strcat
作为目标缓冲区。试图覆盖常量字符串是不好的。即使它不是常数,你也要写4个字符(包括终止空值)。这也很糟糕。
你可能想要这个:
char *two(char *result, char *str)
{
return strcat(strcpy(result, str), str);
}
当你打电话时,
int main() {
char buf[40];
printf("The value of two(\"foo\") is %s", two(buf, "foo"));
}
答案 2 :(得分:1)
您没有分配空间来容纳输入字符串的两个副本。
strcpy
复制字符串。
strcat
将一个字符串附加到另一个字符串。
malloc
在堆上分配应该free()
以后的字节。
char *two(char *foo);
int main() {
char * ptr = two("foo");
printf("The value of two(\"foo\") is %s", ptr);
free(ptr);
}
char *two(char *foo) {
char * ptr = malloc(strlen(foo) * 2 + 1);
strcpy(ptr, foo);
strcat(ptr, foo);
return ptr;
}
答案 3 :(得分:0)
您似乎误解了strcat
。请查看this链接,了解其功能的简要说明。特别是手册页说明了
字符串可能不重叠,dest字符串必须有足够的空间用于结果
您为两个参数传递相同的地址,这意味着字符串重叠。另外,我看不出你是如何分配字符串所以我无法判断缓冲区 / 数组中是否有足够的空间用于生成的字符串。