2010-01-19 19 views
8

Je suis vraiment nouveau à C.strpos en C- comment ça marche

Je veux utiliser la fonction strpos mais il me dit qu'il n'existe pas?

+0

Que faut-il faire' strpos' Quels sont les les types et les nombres de ses paramètres, et quelle est la valeur de retour? Puisque le standard C ne définit pas 'strpos()', et POSIX non plus, vous devriez le faire. 'strpos' est réservé en C, donc idéalement, vous voudriez appeler votre fonction autrement,' posstr' par exemple. –

+0

@Alok Pouvez-vous donner une source pour 'strpos' étant réservé en C? –

Répondre

11

La fonction que vous recherchez peut-être soit strstr ou strchr. Vous devez ensuite inclure string.h. Il n'y a pas de strpos dans l'interface POSIX.

3

Oui. Il est appelé strstr, lié à strpos comme (pseudo-code):

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

Probablement devrait être return -1; au lieu de retourner faux; pour des résultats valides de 0 à strlen (str) -strlen (cible) ... strpos n'est pas inclus dans la norme, afaik, parce que le test NULL et soustrait généralement le plus efficace inline donc il a été jugé superflu. –

19

Voici un code d'extrait complet pour résoudre votre problème. PS: Il n'est pas trop tard pour vous aider. ;)

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

Modifier: Répondre à Can Vural question:

Non, je pense vraiment que ce serait comme ça. Au paradigme de programmation structurée, il est courant d'utiliser la structure de périmètre en tant que premier paramètre sur chaque fonction appartenant à la portée de la structure elle-même. La fonction strstr définie sur string.h suit la même approche. Pendant la POO, vous avez haystack.indexOf(needle). À la programmation structurée, vous avez indexOf(haystack, needle).

+0

Ne devrait-il pas être 'strpos (" chaîne "," sous-chaîne ")' –

+0

Can Vural, j'ai édité ma réponse en incluant quelques explications supplémentaires à propos de votre question. – Miere

0

J'ai écrit la fonction strpos() à partir de rien avec la fonction position (comme la fonction strpos() de PHP). La valeur de retour sera la position de départ de la chaîne recherchée. Prendre plaisir! :) Dans cet exemple, la sortie de code

seront 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

Ceci est en réponse à Miere et Can Vural. Je ne peux pas encore ajouter de commentaires, donc je vais ajouter ceci comme réponse.

devrait-il pas être strpos ("string", "sous-chaîne") - Peut Vural

à la programmation structurée, vous avez indexOf (botte de foin, aiguille). Miere

Dans votre code, vous avez:

int strpos(char *haystack, char *needle) 

mais vous aussi:

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

Je suis entièrement d'accord avec les « int strpos (char * botte de foin, aiguille char *) "où la chaîne à rechercher vient en premier et la chaîne à rechercher est la deuxième. Mais pour moi, "subsstring" (dans le contexte de "on est une sous-chaîne et on est une chaîne"), "subsstring" implique que IT est le plus court des deux et que vous essayez de trouver "substring" dans " chaîne."

Ainsi, d'une part:

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

devrait être:

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

qui serait le même que:

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