2012-08-06 18 views
7

Ecco un programma di accettare un:In C trovare la posizione di sottostringa in una stringa

  1. Frase da un utente.
  2. Word da un utente.

Come si trova la posizione della parola inserita nella frase?

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

si può sottrarre 2 puntatori (a 'char') ed interpretare il risultato come un numero intero:' posizione = ptr - sntnc; ' – pmg

+6

** NON FARE USE 'gets()'! NON Fflush() 'INPUT STREAMS! ** – pmg

+0

in Java/JavaScript abbiamo esattamente la funzione che ti serve: indexOf. Tuttavia una ricerca rapida mi ha permesso di trovare una discussione discutendo di ciò che ti serve: una funzione indexOf like in C, per favore controlla questo post: http://stackoverflow.com/questions/4824/string-indexof-function-in-c – gaspyr

risposta

15

Il puntatore ptr indicherà all'inizio del word, in modo da poter semplicemente sottrarre la posizione del puntatore frase, sntnc, da esso:

pos = ptr - sntnc; 
+0

picchiatemi, dang: P –

+9

... ma solo se 'ptr' non è' NULL'. – caf

4

Il ritorno di strstr() è una puntatore alla prima occorrenza della "parola", così

pos=ptr-sntc; 

Questo funziona solo perché SNTC e PTR vengono puntatori alla stessa stringa. Per chiarire quando dico occorrenza, è la posizione del primo carattere di corrispondenza quando viene trovata la stringa corrispondente all'interno della stringa di destinazione.

2

Solo per riferimento:

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'. 
    } 
} 
1

Per alcuni motivi che ho avuto problemi con strstr(), e volevo anche indice.

Ho eseguito questa funzione per trovare la posizione della sottostringa all'interno di una stringa più grande (se esiste) altrimenti restituisce -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"); 
    } 
} 
0

commenti per il post originale in questa discussione: Questa dichiarazione non è corretta:

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

codice C non sarebbe nemmeno la compilazione: fallirà su questa linea:

ptr = strstr(sntnc,word); 

Quindi la riga deve essere modificata in:

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

E NON è necessario il memeory assegnato a 'ptr string'. Hai solo bisogno di un puntatore per char.

0

È possibile utilizzare questo semplice strpos Modifiche all'apparecchio

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