在C语言中复制字符串结尾

7

我正在尝试在C语言中使用strncpy将字符串的一部分复制到另一个字符串中。

例如:

c[] = "How the heck do I do this";

然后将 "do this" 复制到另一个字符串中,以使:
d[] = "do this"

需要帮助,感激不尽。

4个回答

12

只需传递您想要复制的第一个字母的地址:strcpy(dest, &c[13])

如果您想在字符串结束之前结束,请使用strncpy或更好的是memcpy(不要忘记将复制的字符串以0结尾)。


那么假设'do'中的'd'在第20个位置strncpy(dest, &c[20]),这是正确的吗?还是应该用数组d替换“dest”? - Church
几乎。strncpy需要一个长度,strncpy(dest, &c[20], 8)。无论dest是指向足够大的malloced内存区域的char*还是足够大的char[N]都没有关系。 - Daniel Fischer
好的,有道理,那就使用strcpy,但是我该如何将它赋值给数组d呢? - Church
你是指将它赋值给数组 d 是什么意思?strcpy(d, &c[20]) 将从位置 20 到 0 终止符(包括)的 c 数组部分复制到数组 d 中。 - Daniel Fischer
是的,那就是我想要的!我一直没搞对格式,但我已经很接近了。谢谢! - Church

4

strncpy(几乎总是)是错误的选择。在这种特定情况下,它可以工作,但几乎只是偶然的——因为你正在复制字符串的结尾,所以它会像strcpy一样工作。当然,这导致strcpy也能工作,但更容易。

如果您想处理更一般的情况,有一个相当令人惊讶(但非常有效)的选择:sprintf可以完全满足您的要求:

sprintf(d, "%s", c+20);

sprintf(与strncpystrcpy不同)也适用于最一般的情况——假设你想仅将do I复制到d,但希望d成为一个正确的以NUL结尾的字符串:

sprintf(d, "%*s", 4, c+13);

这里的4是要复制的部分的长度,c+13是指向要复制部分开头的指针。


最后一个例子对我不起作用。它返回的是“do I do this”,而不是“do I d”。http://ideone.com/u8HRuI - mrdaliri
我同意sprintf是最好的选择(我在所有字符串复制操作中使用它),但我认为snprintf更好。别叫我多疑……我更进一步定义了snprintf_safe函数,其返回值仅限于0到n-1范围内有效数字(其中n为缓冲区大小)。我发现了一类使用snprintf返回值的错误,因为它可以返回比实际写入的字符串更长的值,这在某些情况下很有用,但当您不期望此时发生时就很危险。。。 - Wayne Uroda

0

看起来你正在寻找strncpy函数。不要在意C++网站,文档是针对C的。

或者你也可以使用strcpy函数。


注意:目标字符串结尾不会自动添加空字符,因此只有在源字符串的长度小于 num 时,目标字符串才会以空字符结尾。 - John Carter

0

使用memcpy可能更合适,可以只复制字符串的一部分。

实际上,使用strncpy或strcpy会复制整个字符串直到'\0'终止符。

无论如何,明智起见,要假设结果字符串有足够的空间,否则会发生缓冲区溢出,请确保缓冲区有足够的空间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接