2012-08-06 41 views
7

Aquí hay un programa para aceptar una:encontrar la posición de una subcadena en una cadena

  1. frase de un usuario.
  2. Palabra de un usuario.

¿Cómo puedo encontrar la posición de la palabra ingresada en la oración?

#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

puede restar 2 punteros (a 'char') e interpretar el resultado como un entero:' posición = ptr - sntnc; ' – pmg

+6

** NO USE 'gets()'! NO 'fflush()' INPUT STREAMS! ** – pmg

+0

en Java/JavaScript tenemos exactamente la función que necesita: indexOf. Sin embargo, una búsqueda rápida me permitió encontrar un hilo de discusión sobre lo que necesita: un índice de función similar en C, consulte esta publicación: http://stackoverflow.com/questions/4824/string-indexof-function-in-c – gaspyr

Respuesta

15

El puntero ptr señalará el comienzo de word, lo que sólo puede restar la ubicación del puntero frase, sntnc, de ella:

pos = ptr - sntnc; 
+0

vencerme, dang: P –

+9

... pero solo si 'ptr' no es' NULL'. – caf

4

El regreso de strstr() es una puntero a la primera ocurrencia de la "palabra", por lo que

pos=ptr-sntc; 

Esto sólo funciona porque SNTC y PTR son punteros a la misma cadena. Para aclarar cuándo digo ocurrencia, es la posición del primer carácter coincidente cuando la cadena coincidente se encuentra dentro de la cadena objetivo.

2

Sólo como referencia:

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

Por algunas razones que estaba teniendo problemas con strstr(), y también quería índice.

Hice esta función para encontrar la posición de la subcadena dentro de una cadena más grande (si existe) de lo contrario devuelve -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

Mi comentario en el post original en este hilo: Esta declaración es incorrecta:

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

código C ni siquiera compilar: se producirá un error en esta línea:

ptr = strstr(sntnc,word); 

Entonces la línea se cambiará a:

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

Y NO necesita memeory asignado a 'ptr string'. Solo necesitas un puntero a char.

0

Puede utilizar Modificación de estos sencillos 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; 
} 
Cuestiones relacionadas