字符串的一部分可以复制到C中的另一个字符串吗?但复制的开始索引不为零[关闭]

问题描述 投票:-1回答:3

例如,我有这个字符串:

ABABcct

我可以复制吗?

ABc
begin index = 2, end index = 4 

......从那个字符串?

是否有任何特定的内置功能可以做到这一点?

我知道strncpy()可以从字符串的开头复制一个字符串的多个字符到另一个字符串。但我认为它不能做我刚才描述的事情。据我所知,它的“开始索引”仅限于0。

c string copy
3个回答
2
投票

实际上你可以使用函数strncpy()和一个指向字符串中任何位置的指针,而不仅仅是指向它开头的指针。

例:

char *src = strdup("ABABcct");
char *dest;

strncpy(dest, src + 2, 3) // Copies 3 characters from your pointer src + 2 to your pointer dest

如果您运行此代码,dest将包含ABc


0
投票

虽然在您的情况下标准复制功能最终会起作用,但在源和目标重叠时不允许使用它们,在这种情况下您将体验UB。

对于这样的问题,标准C库提供了设计用于处理重叠区域的功能memmove。它的工作原理是使用中间缓冲区来解决任何重叠问题。

另见Meaning of overlapping when using memcpy


0
投票

随着strncpy

#include <stdio.h>
#include <string.h>
int main(void)
{
    char p[10],s[10]="abcdefgh";
    strncpy(p,s+2,3);
    puts(p);
    return 0;
}

I know strncpy() ... As far as I know, its "begin index" (as I call it) is limited to 0.

你知道错了。这不是关于开始索引或任何东西 - 只需要在char*src中传递相关的target,这是在这里完成的。 为了进一步说明 - 您正在讨论的大多数标准库函数从未设置将指针传递给第0个索引的约束。你发送哪个索引并不重要 - 你可以发送100或50并不重要,只要它遵循函数预期的事情(null终止等)。

此处发布的代码仅用于说明目的 - 不包括使用str*cpy函数所需的必要检查。

© www.soinside.com 2019 - 2024. All rights reserved.