web-dev-qa-db-ja.com

Cでは、文字列内の部分文字列の位置を見つけます

これを受け入れるプログラムは次のとおりです。

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

ptrポインタはWordの先頭を指すので、そこから文ポインタsntncの位置を引くだけです。

pos = ptr - sntnc;
19
Gingi

参考までに:

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'.
    }
}
4
xtrm

Strstr()の戻り値は、「Word」の最初の出現へのポインタであるため、

pos=ptr-sntc;

これは、sntcとptrが同じ文字列へのポインタであるためにのみ機能します。発生と言うときを明確にするために、一致する文字列がターゲット文字列内で見つかったときの最初の一致する文字の位置です。

4
Ralph Johnson

この単純な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;
}
3
Howard J

なんらかの理由で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"); 
     }
 } 
2
Pranav Nandan

このスレッドの元の投稿に対する私のコメント:この宣言は正しくありません:

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

Cコードはコンパイルすらしません:それはこの行で失敗します:

    ptr = strstr(sntnc,Word);

したがって、行は次のように変更されます。

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

また、「ptrstring」にメモリを割り当てる必要はありません。 charへのポインタが必要です。

0
derlo