使用strcat()和字符串中的char?

时间:2015-02-25 19:08:01

标签: c strcat

我正在尝试将字符串中的字符附加到新字符串中。对于以下代码:

int main(void)
{

char s1[] = "cat";
char s2[] = "hsklsdksdhkjadsfhjkld";   

strcat(s1, &s2[1]);

printf("s1 is now %s\n", s1);

}

为什么输出catsklsdksdhkjadsfhjkld而不是猫?为什么要添加整个字符串,而不仅仅是位于s2 [1]的's'?

感谢。

4 个答案:

答案 0 :(得分:2)

因为char *只是指向字符串开头的指针; C假设字符串的结尾是\0个字符。所以添加所有字符直到他遇到\0字符

你假设&s2[1]指向“s”,(这是真的),但由于它是一个char指针,它指向整个char数组,直到最后的\0字符。试试这个例子:

printf("%s\n", &s2[1]);

将产生:

sklsdksdhkjadsfhjkld

来自strcat的参考:

  

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

修改 如果您只想添加一个(或一些)字符,请使用strncat

strncat(s1, &s2[1], 1 /*number of chars to append*/);

<强> EDIT2 确保你的char数组足够大,如@PaulR所建议的那样:

char s1[32] = "cat";

答案 1 :(得分:2)

strcat的两个参数都是char个对象的指针,并且假设两者都指向字符串的(初始字符)。

例如,这个:

strcat(s1, &s2[0]);

相当于:

strcat(s1, s2);

在这两种情况下,第二个参数是指向字符串的初始字符的指针,strcat用来访问整个字符串,包括终止'\0'空字符。

但是你的程序有不确定的行为。通过声明

char s1[] = "cat";

让编译器根据初始化程序确定s1的大小。在这种情况下,s1是一个包含4 char s的数组(包括终止'\0')。没有空间可以附加任何东西。显然,当你运行它时,它会立即将字符复制到s1之后的内存空间中,这就是似乎“工作”的原因。

您的计划的工作版本是:

#include <stdio.h>
#include <string.h>
int main(void)
{
    char s1[50] = "cat";
    char s2[] = "hsklsdksdhkjadsfhjkld";   

    strcat(s1, &s2[1]);

    printf("s1 is now %s\n", s1);
}

请注意#include指令。这些不是可选的,即使你可能会放弃它们。

答案 2 :(得分:1)

您可以使用strncat代替strcat

#include <stdio.h>
#include <string.h>

int main(void)
{
    char s1[32] = "cat"; // NB: s1 needs to be large enough to hold additional chars !
    char s2[32] = "hsklsdksdhkjadsfhjkld";   

    strncat(s1, &s2[1], 1);

    printf("s1 is now %s\n", s1);

    return 0;
}

LIVE DEMO

答案 3 :(得分:1)

因为strcat()需要两个字符串参数,并且因为&s2[1]不是一个字符,所以它是字符串"sklsdksdhkjadsfhjkld";

所以strcat(s1, &s2[1]);联合

"cat" + "sklsdksdhkjadsfhjkld"

给出结果

"catsklsdksdhkjadsfhjkld"

如果你想附加单个字符,你可以这样做

len = strlen (s1);
s1[len] = s2[1];
s1[len+1] = '\0';       // new string terminator

但你必须确保有足够的数组(字符串)空间。