我正在尝试将字符串中的字符附加到新字符串中。对于以下代码:
int main(void)
{
char s1[] = "cat";
char s2[] = "hsklsdksdhkjadsfhjkld";
strcat(s1, &s2[1]);
printf("s1 is now %s\n", s1);
}
为什么输出catsklsdksdhkjadsfhjkld而不是猫?为什么要添加整个字符串,而不仅仅是位于s2 [1]的's'?
感谢。
答案 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)
#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;
}
答案 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
但你必须确保有足够的数组(字符串)空间。