[英]C function using strcat with strings
我正在尝试学习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
和指针字符串。
您要打破的strcat
有多个规则:
文档说strcat
将源字符串的副本附加到目标字符串。 目标中的终止空字符将被源的第一个字符覆盖,并且在目标中两者的串联所形成的新字符串的末尾将包含一个空字符。\\
您正在将常量字符串"foo"
传递给strcat
作为目标缓冲区。 尝试覆盖常量字符串是不好的。 即使不是恒定的,您也要在4个字符上写7个字符(包括终止的null)。 这也是不好的。
您可能想要这样:
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"));
}
您没有分配空间来容纳输入字符串的两个副本。
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;
}
看来您对strcat
有误解。 请查看此链接,以简要了解其功能。 手册页特别指出
字符串不能重叠,dest字符串必须有足够的空间容纳结果
您要为两个参数传递相同的地址,这意味着字符串重叠 。 另外,我看不到您如何分配字符串,所以我无法确定缓冲区 / 数组中是否有足够的空间用于生成的字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.