9

这是一个接受的程序:

  1. 来自用户的一句话。
  2. 用户的话。

如何找到输入的单词在句子中的位置?

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

6 回答 6

21

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

pos = ptr - sntnc;
于 2012-08-06T22:00:39.570 回答
5

仅供参考:

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'.
    }
}
于 2013-04-17T14:36:55.323 回答
4

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

pos=ptr-sntc;

这仅适用于 sntc 和 ptr 是指向同一字符串的指针。为了澄清当我说发生时,它是在目标字符串中找到匹配字符串时第一个匹配字符的位置。

于 2012-08-06T22:03:00.940 回答
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;
}
于 2017-11-07T14:46:30.823 回答
2

由于某些原因,我在使用 strstr() 时遇到了问题,而且我还想要 index.html。

我制作了这个函数来查找更大字符串(如果存在)中子字符串的位置,否则返回-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"); 
     }
 } 
于 2014-03-24T04:55:38.797 回答
0

我对该线程中原始帖子的评论:此声明不正确:

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

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

    ptr = strstr(sntnc,word);

所以该行应更改为:

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

而且你不需要分配给'ptr string'的内存。你只需要一个指向 char 的指针。

于 2014-09-26T09:30:58.990 回答