gpt4 book ai didi

C 版本的 strpos 和 substr?

转载 作者:太空宇宙 更新时间:2023-11-04 05:29:11 24 4
gpt4 key购买 nike

我真的很惊讶我找不到有效的方法来做到这一点。我已经尝试过 strstr,它是 sscanf 的组合,但根据我在其他语言方面的经验,似乎没有什么能像我期望的那样工作。

我有一个字符“ABCDEFG HIJ K BEGINTheMiddleEND LMNO PQRS”。我不知道“BEGINTheMiddleEND”在字符串中的位置,我想通过查找出现的“”以等于“TheMiddle”的字符结尾BEGIN”和“END”并捕获中间的内容。

完成此任务(查找和子字符串)的最有效方法是什么?

谢谢!

-- 根据答案进行编辑 --

我试过这个:

char *searchString = "ABCDEFG HIJ K BEGINTheMiddleEND LMNO PQRS"
char *t1, *t2;
t1 = strstr(searchString, "BEGIN");
t2 = strstr(t1, "END");

但是从指针的角度来看肯定有问题,因为它对我不起作用。 Strstr 只接受两个参数,所以我不确定从前一个指针开始是什么意思。我也不确定如何使用这些指针对其进行子字符串化,因为它们不是像 strpos 返回的整数值,而是字符指针。

再次感谢。

-- 使用最终代码进行编辑 --

对于任何其他点击这里的人,最后的工作代码:

char *searchString = "ABCDEFG HIJ K BEGINTheMiddleEND LMNO PQRS"
char *b = strstr(searchString , "BEGIN");
char *e = strstr(b, "END");
int offset = e - b;
b[offset] = 0;

其中“b”现在等于“BEGINTheMiddle”。 (事实证明,这正是我在这种情况下所需要的)。

再次感谢大家。

最佳答案

您需要了解什么是字符串。以 0 分隔的字符序列。

strstr 做它所说的:它找到给定子字符串的开头。

因此,用针“BEGIN”调用 strstr 会将您带到该子串的位置。指向“BEGIN”的指针向前移动 5 个字符,指向“TheMiddle”下一个 0 个字符。通过搜索“END”您可以找到结束指针,然后您需要将子字符串复制到一个新的字符串数组中(或将其剪切,将“E”替换为 0;或实现您自己的字符串函数不使用 0 终止字符串,因此它们可以任意重叠)。

这可能是您仍然缺少的步骤:实际复制字符串。例如。使用

 t3 = strndup(t1, t2 - t1);

以字符串 ABCDEF0 为例,其中 0 是实际的 0 字符。指向开头的指针指向完整的字符串,指向 E 的指针仅指向“EF”。如果要获取字符串“AB”,则需要将其复制到“AB0”,或者将 C 替换为 0。

strstr 不会为您进行复制。它只是找到了位置。如果你想要一个索引,你可以做 int offset = newPosition - oldPosition; , 但如果您需要继续搜索,使用 newPosition 会更容易指针。

所有这些都不如例如Java中的字符串操作。据我所知,除了截断字符串外,它实际上更有效,如果您了解以 0 结尾的内存布局,它就很有意义。只有当您将字符串视为数组时,中间某处有一个指针并继续像常规数组一样使用它才显得奇怪。这使得“sub = string + offset”成为“sub = string.substring(offset)”的 C 写法。

关于C 版本的 strpos 和 substr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12591748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com