0

我正在尝试学习 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

4 回答 4

7

strcat您违反了多项规则:

  • 第一个参数不应该是字符串文字,因为它是不可修改的。
  • 第一个参数必须足够大以容纳连接的字符串。
  • 第一个和第二个参数不应重叠。
于 2013-09-16T01:17:00.447 回答
4

文档说strcat

将源字符串的副本附加到目标字符串。目标中的终止空字符被源的第一个字符覆盖,并且在目标中由两者连接形成的新字符串的末尾包含一个空字符。\

您正在传递一个常量字符串"foo"作为strcat目标缓冲区。试图覆盖常量字符串是不好的。即使它不是恒定的,您也会在 4 上写 7 个字符(包括终止的空值)。这也很糟糕。

你可能想要这个:

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"));
}
于 2013-09-16T01:17:42.777 回答
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;
}
于 2013-09-16T01:14:46.463 回答
0

看来你是误会了strcat。查看链接以简要说明其作用。特别是手册页说

字符串不能重叠,且dest字符串必须有足够的空间存放结果

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

于 2013-09-16T01:12:28.183 回答