C函数使用strcat和字符串

时间:2013-09-16 01:09:07

标签: c string pointers strcat

我正在努力学习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

4 个答案:

答案 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字符串必须有足够的空间用于结果

您为两个参数传递相同的地址,这意味着字符串重叠。另外,我看不出你是如何分配字符串所以我无法判断缓冲区 / 数组中是否有足够的空间用于生成的字符串。