子串提取练习

时间:2009-05-09 00:53:00

标签: c algorithm

给定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.

5 个答案:

答案 0 :(得分:3)

这是家庭作业吗?无论如何,看看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。

答案 1 :(得分: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

答案 2 :(得分:2)

#include <string.h>

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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