将 strcat() 与字符串中的字符一起使用?

Using strcat() with a char from a string?

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

int main(void)
{

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

strcat(s1, &s2[1]);

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

}

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

谢谢。

因为 char * 只是指向字符串开头的指针; C 假设字符串的结尾是一个 [=15=] 字符。所以所有的字符都加起来,直到他遇到[=15=]字符

你假设&s2[1]指向"s",(这是真的),但由于它是一个char指针,它指向整个char数组,直到[=15=]字符在末尾。例如试试这个:

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

这将产生:

sklsdksdhkjadsfhjkld

来自 strcat 的参考:

Concatenate strings Appends a copy of the source string to the destination string. The terminating null character in destination is overwritten by the first character of source, and a null-character is included at the end of the new string formed by the concatenation of both in destination.

编辑 如果只想添加一个(或一些)字符,请使用 strncat:

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

EDIT2 确保您的 char 数组足够大,正如@PaulR 所建议的那样:

char s1[32] = "cat";

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

例如,这个:

strcat(s1, &s2[0]);

相当于:

strcat(s1, s2);

在这两种情况下,第二个参数都是指向字符串起始字符的指针,strcat 使用它来访问整个字符串,直至并包括终止 '[=17=]' 空字符。

但是你的程序有未定义的行为。通过声明

char s1[] = "cat";

你让编译器根据初始化程序确定 s1 的大小。在这种情况下,s1 是一个 4 char 的数组(包括终止的 '[=17=]')。没有空间可以向其附加任何内容。显然,当你 运行 它时,它会在 s1 之后立即将字符复制到内存 space 中,这就是为什么它 看起来 到 "work" .

您的程序的工作版本是:

#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 指令。这些不是可选的,即使您 可能 忽略它们。

您可以使用 strncat instead of 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

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

所以 strcat(s1, &s2[1]); 连接

"cat" + "sklsdksdhkjadsfhjkld"

给出结果

"catsklsdksdhkjadsfhjkld"

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

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

但您必须确保有足够的数组(字符串)space可用。