在C中查找字符串中子字符串的位置

时间:2012-08-06 21:53:06

标签: c string substring strstr

这是一个接受a:

的程序
  1. 来自用户的判决。
  2. 来自用户的Word。
  3. 如何找到句子中输入单词的位置?

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main()
    {
        char sntnc[50], word[50], *ptr[50];
        int pos;
        puts("\nEnter a sentence");
        gets(sntnc);
        fflush(stdin);
        puts("\nEnter a word");
        gets(word);
        fflush(stdin);
        ptr=strstr(sntnc,word);
    
        //how do I find out at what position the word occurs in the sentence?
    
        //Following is the required output
        printf("The word starts at position #%d", pos);
        return 0;
    }
    

6 个答案:

答案 0 :(得分:19)

ptr指针将指向word的开头,因此您只需从中减去句子指针sntnc的位置:

pos = ptr - sntnc;

答案 1 :(得分:4)

strstr()的返回是指向“单词”第一次出现的指针,所以

pos=ptr-sntc;

这只能起作用,因为sntc和ptr是指向同一个字符串的指针。为了澄清当我说出现时,当你在目标字符串中找到匹配的字符串时,它是第一个匹配字符的位置。

答案 2 :(得分:4)

仅供参考:

char saux[] = "this is a string, try to search_this here";
int dlenstr = strlen(saux);
if (dlenstr > 0)
{
    char *pfound = strstr(saux, "search_this"); //pointer to the first character found 's' in the string saux
    if (pfound != NULL)
    {
        int dposfound = int (pfound - saux); //saux is already pointing to the first string character 't'.
    }
}

答案 3 :(得分:3)

您可以使用此简单的strpos修改

#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;
}

答案 4 :(得分:2)

由于某些原因,我遇到了strstr()问题,我也想要索引。

我使用此函数在较大的字符串中找到子字符串的位置(如果存在),否则返回-1。

 int isSubstring(char * haystack, char * needle) {
     int i = 0;
     int d = 0;
     if (strlen(haystack) >= strlen(needle)) {
         for (i = strlen(haystack) - strlen(needle); i >= 0; i--) {
             int found = 1; //assume we found (wanted to use boolean)
             for (d = 0; d < strlen(needle); d++) {
                 if (haystack[i + d] != needle[d]) {
                     found = 0; 
                     break;
                 }
             }
             if (found == 1) {
                 return i;
             }
         }
         return -1;
     } else {
         //fprintf(stdout, "haystack smaller\n"); 
     }
 } 

答案 5 :(得分:0)

我对此帖子中ORIGINAL帖子的评论: 这个声明是不正确的:

    char sntnc[50], word[50], *ptr[50];

C代码甚至无法编译:它将在此行失败:

    ptr = strstr(sntnc,word);

因此该行应改为:

   char sntnc[50], word[50], *ptr;

并且您不需要将记忆分配给&#39; ptr字符串&#39;。你只需要一个指向char的指针。