0

I know strncpy(s1, s2, n) copies n elements of s2 into s1, but that only fills it from the beginning of s1. For example

s1[10] = "Teacher"
s2[20] = "Assisstant"
strncpy(s1, s2, 2) would yield s1[10] = "As", correct?

Now what if I want s1 to contain "TeacherAs"? How would I do that? Is strncpy the appropriate thing to use in this case?

4

5 回答 5

2

您可以使用strcat()来连接字符串,但是在这种情况下您不希望复制所有源字符串,因此您需要使用以下内容:

size_t len = strlen(s1);
strncpy(s1 + len - 1, s2, 2);
s2[len + 2] = '\0';

(添加终止 nul;感谢@FatalError)。

这非常可怕,您需要担心目标数组中剩余的空间量。请注意,如果s1为空,则代码将中断!

有些系统下有strncat()manpage),使用起来要简单得多:

strncat(s1, s2, 2);
于 2013-02-20T16:40:48.563 回答
0

使用strcat

确保您要附加的字符串足够大以容纳两个字符串。在你的情况下,它不是。

从上面的链接:
char * strcat ( char * destination, const char * source );

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

目的地和来源不得重叠。

于 2013-02-20T16:40:07.343 回答
0

为了实现你需要的东西,你必须使用strlcat(但要小心!它被认为是不安全的)

strlcat(s1, s2, sizeof(s1));

这将连接到字符串s1的一部分s2,直到s1达到 的大小(这避免了memory overflow

然后你会进入s1字符串TeacherAs+ 一个 NUL 字符来终止它

于 2013-02-20T16:48:07.380 回答
0

您需要确保为结果字符串分配了足够的内存

s1[10]

没有足够的空间容纳“教师”。

从那里,你会想做类似的事情

//make sure s1 is big enough to hold s1+s2
s1[40]="Teacher";
s2[20]="Assistant";

//how many chars from second string you want to append
int offset = 2;
//allocate a temp buffer 
char subbuff[20];
//copy n chars to buffer
memcpy( subbuff, s2, offset );
//null terminate buff
subbuff[offset+1]='\0';

//do the actual cat
strcat(s1,subbuff);
于 2013-02-20T16:49:25.887 回答
0

我建议使用snprintf(),例如:

size_t len = strlen(s1);
snprintf(s1 + len, sizeof(s1) - len, "%.2s", s2);

snprintf()将始终 nul 终止并且不会超出您的缓冲区。另外,它是 C99 的标准配置。请注意,这假定它s1是在当前范围内声明的数组,以便sizeof工作,否则您需要提供大小。

于 2013-02-20T16:52:24.283 回答