繁体   English   中英

C函数与字符串一起使用strcat

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM