将 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;
}
因为 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可用。
我正在尝试将字符串中的字符附加到新字符串中。对于以下代码:
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;
}
因为 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可用。