【问题标题】:Substring Extraction exercise [closed]子串提取练习
【发布时间】:2009-05-09 00:53:00
【问题描述】:

给定 2 个字符串,编写一个函数,如果字符串 A 是字符串 B 的子字符串,则返回与字符串 A 匹配的字符串 B 的位置。否则返回 -1。 示例:

strA = "ello"
strB = "Hello_World"
Your function should return 1.

strA = "blah"
strB = "blha"
Your function should return -1.

【问题讨论】:

  • 我看到这里只接受天才提出的问题!为什么每个人都对新手如此粗鲁?
  • 不要让其他人做你的作业。如果你不自己做,你就不会学到你应该学的东西。
  • 因为这不是 HomeworkOverflow。您不必是天才,但您必须不要试图在作业上作弊,并努力自己解决问题
  • 反斜杠17,这种问题的问题在于,这显然是提问者希望我们为他解决的某种练习。请注意,寻求帮助并没有错,但谨慎的做法是表现出自己的努力。
  • 如果他作弊是他的问题而不是我们的问题,请记住,一个问题可以解决很多人的问题,而不仅仅是提问者!!!!!!

标签: c algorithm


【解决方案1】:

这是作业吗?不管怎样,看看string.h documentation,你应该可以毫不费力地找到你需要的东西。您将需要在其中一个函数上编写一个非常薄的包装器。或者,当然,你也可以自己写。

编辑:嗯,其他人给出了答案,所以这是我的尝试。

#include <string.h>

ssize_t str_index(const char *strA, const char *strB)
{
    const char *result;
    return (result = strstr(strB, strA)) ? (result - strB) : -1;  
}

唯一的技巧是参数顺序与 strstr 相反,您返回的是 ssize_t 而不是 char *,因此失败代码为 -1。

【讨论】:

  • 只是想说你相信 strstr() 有一个“不错”的实现,但它可能是一场病态的灾难。
  • 而且 size_t 是无符号的。应该使用 ssize_t。
  • ssize_t 很好。出于好奇,有人知道 gcc 的警告级别是什么(如果有的话)吗? -Wall -Wextra 没有。是的,我故意相信 strstr,因为我没有理由不相信。
【解决方案2】:

蛮力版:

int strpos(char* a, char* b) {
  int n1, n2, i, j;
  n1 = strlen(a);
  n2 = strlen(b);
  for (i = 0; i < n1-n2; i++) {
    for (j = 0; j < n2; j++) {
      if (a[i+j] != b[j]) break;
      else if (j+1 == n2) return i;
    }
  }
  return -1;
}

更有效的算法:Wikipedia: String searching

【讨论】:

  • 如果你要使用 string.h (或者真的即使你不是),为什么这么冗长?此外,如果提前执行 strlen,您会失去大部分从跳出循环中获得的好处。
  • 只是为了展示它是如何做到的。
  • 是的,但正如我所说,这是一个幼稚的实现,因为 strlen 等等。
【解决方案3】:
#include <string.h>

int search(char* a, char* b) {
    char* pos;
    pos = strstr(b, a);
    if(pos == 0) return -1;
    return (int)(pos-b);
}

【讨论】:

    【解决方案4】:

    这听起来几乎完全像一个家庭作业问题。在这不是作业问题的奇怪情况下,C 库函数 strstr 返回一个指针,该指针指向另一个字符串中第一次出现的字符串(如果不存在,则返回 null)。从那里,使用指针算法确定索引是微不足道的。

    【讨论】:

      【解决方案5】:

      尝试学习 strstr。它在 string.h 中可用 绝不有理由编写标准库中已有的代码。 除非当然,这是一个家庭作业问题:)

      【讨论】:

      • 它总是不是功课。有时人们试图实现该功能,以便他们能够以更好的方式使该功能发挥作用
      • @fahad :很公平,但 OP 提出问题的方式闻起来像家庭作业
      猜你喜欢
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-28
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多