2010-01-19 15 views
8

Soy realmente nuevo en C.strpos en C- ¿Cómo funciona?

¿Quiero usar la función strpos pero me dice que no existe?

+0

¿Qué debe hacer strpos'' ¿Cuáles son las tipos y los números de sus parámetros, y ¿cuál es el valor de retorno? Dado que el estándar C no define 'strpos()', y POSIX tampoco, usted debe. 'strpos' está reservado en C, por lo que idealmente querrías llamar a tu función otra cosa,' posstr' por ejemplo. –

+0

@Alok ¿Puedes dar una fuente para que 'strpos' se reserve en C? –

Respuesta

11

La función que busca puede ser strstr o strchr. Luego necesita incluir string.h. No hay strpos en la interfaz POSIX.

3

Sí. Se llama strstr, relacionada con strpos como (pseudo-código):

strpos(str, target) { 
    res = strstr(str, target); 
    if (res == NULL) return false; 
    else    return res - str; 
} 
+0

Probablemente debería ser return -1; en lugar de devolver falso; para resultados válidos de 0 a strlen (str) -strlen (target) ... strpos no está incluido en el estándar, afaik, porque la prueba NULL y resta generalmente más eficiente en línea por lo que se sintió superfluo. –

19

Aquí hay un código de fragmento completo para resolver su problema. PS: No es demasiado tarde para ayudar. ;)

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define NOT_FOUND -1 

int main(){ 
    int pos = NOT_FOUND; 
    if ((pos = strpos("subsstring", "string")) != NOT_FOUND) 
     printf("found at %d\n", pos); 
    else 
     printf("not found!\n"); 
    return 0; 
} 

int strpos(char *haystack, char *needle) 
{ 
    char *p = strstr(haystack, needle); 
    if (p) 
     return p - haystack; 
    return NOT_FOUND; 
} 

Edición: Respondiendo a la pregunta de Can Vural:

No. Realmente creo que sería como es. En el paradigma de programación estructurada, es una práctica común utilizar la estructura del alcance como el primer parámetro en cada función que pertenece al alcance de la estructura en sí. La función strstr definida en string.h sigue el mismo enfoque.

En OOP tiene haystack.indexOf(needle). En la programación estructurada, tiene indexOf(haystack, needle).

+0

No debería ser 'strpos (" cadena "," subcadena ")' –

+0

Can Vural, he editado mi respuesta incluyendo algunas explicaciones adicionales sobre su pregunta. – Miere

0

He escrito la función strpos() desde cero con la función de posición (Como la función de strpos() de PHP). El valor de retorno será la posición inicial de la cadena buscada. ¡Disfrutar! :)

En este ejemplo de salida de código será 12

#include <stdio.h> 
#include <string.h> 

int strpos(char *haystack, char *needle, int pos); 

int main(){ 

    printf("%d",strpos("abcdefabcdefabcdef asdfgavcabcddd","abc",10)); 

    return 0; 
} 

int strpos(char *haystack, char *needle, int pos){ 
    int i,j,check,result = -1; 
    int len_needle=strlen(needle); 
    int len_haystack=strlen(haystack); 
    i = pos; 
    if (len_needle>len_haystack || *needle==NULL || i>(len_haystack-1)) return result; 

    for(;i<len_haystack;i++){ 
     check = 0; 
     for(j=0;j<len_needle;j++){ 
      if(haystack[i+j]==needle[j]){ 
       check++; 
      } 
     }   
     if(check==len_needle){ 
      result = i; 
      break; 
     } 

    } 
    return result; 
} 
0

Esto es en respuesta a Miere y Can Vural. No puedo agregar comentarios todavía así que agregaré esto como una respuesta.

¿No debería ser strpos ("cadena", "subcadena") - ¿Puede Vural

En la programación estructurada, tiene indexOf (pajar, aguja). Miere

En su código, usted tiene:

int strpos(char *haystack, char *needle) 

pero también tienes:

(pos = strpos("subsstring", "string")) 

estoy totalmente de acuerdo con los "strpos int (char * pajar, char aguja *) "donde la cadena que se busca es lo primero y la cadena para buscar FOR viene en segundo lugar. Pero para mí, "subsstring" (en el contexto de "uno es una subcadena y el otro es una cadena"), "subsstring" implica que IT es el más corto de los dos y que estás tratando de encontrar "substring" en " cuerda."

Así, por una parte:

(pos = strpos("subsstring", "string")) 

debería ser:

(pos = strpos("string" /*that which is being searched within/*, "substring" /*that which is being searched for in the previous parameter*/)) 

lo que sería lo mismo que:?

(pos = strpos("haystack", "needle"))