C 子串提取练习

C 子串提取练习,c,algorithm,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. 这是家庭作业吗?不管怎么说,看看这本书,你应该会毫不费力地找到你需要的东西。您需要在其中一个函数上编写一个非常薄的包装器

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

这是家庭作业吗?不管怎么说,看看这本书,你应该会毫不费力地找到你需要的东西。您需要在其中一个函数上编写一个非常薄的包装器。当然,你也可以自己写

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

#include <string.h>

ssize_t str_index(const char *strA, const char *strB)
{
    const char *result;
    return (result = strstr(strB, strA)) ? (result - strB) : -1;  
}
#包括
ssize_t str_索引(常量字符*strA,常量字符*strB)
{
常量字符*结果;
返回(结果=strstr(strB,strA))?(结果-strB):-1;
}
唯一的技巧是参数顺序与strstr相反,返回的是ssize_t而不是char*,因此失败代码为-1。

暴力版本:

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;
}
int strpos(char*a,char*b){
int n1,n2,i,j;
n1=strlen(a);
n2=strlen(b);
对于(i=0;i

更有效的算法:

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

\include
#include <string.h>

int search(char* a, char* b) {
    char* pos;
    pos = strstr(b, a);
    if(pos == 0) return -1;
    return (int)(pos-b);
}
整数搜索(字符*a,字符*b){ char*pos; pos=strstr(b,a); 如果(pos==0)返回-1; 返回(内部)(pos-b); }
尝试了解strstr。它在string.h中可用 永远都没有理由对标准库中已有的内容进行编码。
当然,除非是家庭作业问题:)

因为我看到这里只接受天才提出的问题!为什么每个人都对新手如此粗鲁?不要让别人帮你做作业。如果你自己不去做,你就学不到你应该学的东西。因为这不是家庭作业。你不必是天才,但你不必试图在家庭作业上作弊,也不必努力解决你自己的问题。这种提问方式的问题是,很明显,提问者似乎希望我们为他解决某种练习。提醒你,寻求帮助没有什么错,但谨慎的做法是展示自己的努力。如果他作弊是他的问题,而不是我们的问题,记住一个问题可以解决很多人的问题,不仅仅是提问者!!!!!如果您打算使用string.h(或者即使不打算使用),为什么这么冗长?另外,提前完成strlen,您将失去从中断循环中获得的大部分好处。只是为了展示如何完成。是的,但正如我所说的,这是一个幼稚的实现,因为strlen还有其他功能。我只是想说您相信strstr()会有一个“好”的实现,当它可能是一场病态的灾难时。而且这个大小是未签名的。应该使用ssize_t。ssize_t的捕捉效果很好。出于好奇,有人知道gcc的警告级别是什么(如果有)吗-华尔街-Wextra没有。是的,我故意相信strstrstr,因为我没有理由不相信。它永远不是家庭作业。有时人们试图实现函数,以便更好地运行函数way@fahad当前位置很公平,但OP提出问题的方式有点像家庭作业