0

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

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

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

谢谢!

-- 根据答案编辑 --

我试过这个:

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”。(事实证明这是我在这种情况下所需要的)。

再次感谢大家。

4

3 回答 3

4

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

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

因此,使用指针“BEGIN”调用 strstr 会将您带到该子字符串的位置。指向“BEGIN”的指针,前进了 5 个字符,指向“TheMiddle” ,然后指向下一个 0 char。通过搜索“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 方式。

于 2012-09-25T23:35:56.307 回答
3

使用strstr()两次,但第二次从第一次调用strstr()+ strlen(BEGIN) 返回的位置开始。

这将是有效的,因为从返回的第一个指针将strstr()是 BEGIN 的开头,因此您不会再次查看整个字符串,而是从 BEGIN 开始并从那里寻找 END;这意味着您最多只能遍历整个字符串一次

于 2012-09-25T22:05:59.083 回答
0

我希望这个能帮上忙

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int strpos(char *haystack, char *needle, int offset);
int main()
{
    char *p = "Hello there all y'al, hope that you are all well";
    int pos = strpos(p, "all", 0);
    printf("First all at : %d\n", pos);
    pos = strpos(p, "all", 10);
    printf("Second all at : %d\n", pos);
}


int strpos(char *hay, char *needle, int offset)
{
   char haystack[strlen(hay)];
   strncpy(haystack, hay+offset, strlen(hay)-offset);
   char *p = strstr(haystack, needle);
   if (p)
      return p - haystack+offset;
   return -1;
}
于 2017-11-07T14:53:03.217 回答