【问题标题】:How to locate the first occurrence of a string in a string如何定位字符串中第一次出现的字符串
【发布时间】:2013-10-04 03:12:48
【问题描述】:

我需要一个像 memchr() 这样的函数,但它应该能够定位一个子字符串(字符串),不仅仅是单个字符。 它应该返回在字符串中找到的第一个匹配项。

例如

p1 = afunclikememchr(str1,"here the function that can locate this substring",200);

对于模组:我添加了 C++ 标签,因为这也与 C++ 相关

简而言之:我想要一个按惯例称为memstr() 的函数。

另外,我必须使用 C 标准库,而不是 C++,并且该函数在找到 '\0' 字节时不应停止。

【问题讨论】:

  • strstr 对你有用吗? linux.die.net/man/3/strstr
  • strstr 有什么问题?
  • std::search 做你想做的事。
  • 这与 C++ 完全不相关,而且您只想使用 C 库这一事实对您的情况没有帮助。
  • “我必须使用 C 标准库而不是 C++”,“我添加了 C++ 标签,因为这也与 C++ 相关”。矛盾多吗?

标签: c string c99 c89


【解决方案1】:

你需要 strstr 的等价物,它可以在一般数组上工作。这是我从你的问题中假设的。没有你可能发现的 memstr,所以你必须自己写。

类似这样的:

size_t memstr(const unsigned char* arr, size_t length, const unsigned char* tofind, size_t flength) {
   for(size_t i = 0; i < length-flength; ++i) {
      if(memcmp(arr+i, tofind, flength) == 0)
         return i;
   }

   return -1;  //highest possible unsigned value - eg std::string::npos often implemented like this.
}


int main() {
   const unsigned char arr1[] = {1,2,3,4,5,6,7,8,9,0,3,3,3,3,4,4,4,4,4};
   size_t sz = sizeof(arr1) / sizeof(arr1[0]);
   const unsigned char fnd[] = {3,3,3};

   size_t where = memstr(arr1, sz, fnd, 3);
   return 0;
}

【讨论】:

    【解决方案2】:

    既然你用cc++ 标记了这个问题(这是错误的),我正在利用这个事实来回答它,就好像它是一个C 问题一样(我不知道它是否真的):

    所以您正在寻找类似memstr() 的东西,这不是标准功能,但我有一个实现here

    或者只使用 GNU 扩展 memmem(),如果可用并且您不介意非标准。

    【讨论】:

    • 感谢您的回答我添加了这个,因为您可以在 C++ 项目中使用 C 库。
    • 但是ANSI C还有其他方法吗?
    • 但是如果我在子字符串中包含 '\0',strlen 就会停止 size_t needlesize = strlen(needle);考虑一下:子字符串:const char pattern[35] = {0x73,0x00,0x65,0x00,0x6E,0x00,0x64,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x72,0x00,0x6E,0x00,0x61 ,0x00,0x6D,0x00,0x65};
    • @user2400925 我建议你在字典里查一下“haystack”和“needle”这两个词的意思。然后你会得到它。我已经理解你的问题,我的 memstr() 函数正是你想要的。你只需要正确调用它。
    • 好的,我会尝试做的。但是您对 C 库的创建者为什么没有添加这个简单的功能有任何解释或想法吗?我认为它就像 strstr() 一样简单
    【解决方案3】:

    你考虑过 strstr() 吗?

    http://pubs.opengroup.org/onlinepubs/009695399/functions/strstr.html

    strstr() 函数应定位字符串中的第一个匹配项 由字节序列的 s1 指向(不包括终止 s2指向的字符串中的空字节)。

    【讨论】:

    • 是的,但只要找到'\0'就会停止
    • 如果有一个\0 在其中它是不是一个字符串,根据定义。一个字符串在(就在之前)第一个\0 处终止也许你应该改写一下你的问题? (示例字符串中没有\0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 2020-05-22
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    相关资源
    最近更新 更多