2010-01-19 16 views
8

io sono veramente nuovo a C.strpos in C come funziona

voglio usare la funzione strpos ma mi sta dicendo che pretende molto esistono?

+0

Cosa dovrebbe fare' strpos' Quali sono i tipi e il numero dei suoi parametri, e qual è il valore restituito? Poiché lo standard C non definisce 'strpos()', e POSIX no, dovresti. Il nome 'strpos' è riservato in C, quindi idealmente vorresti chiamare la tua funzione qualcos'altro,' posstr' per esempio. –

+0

@Alok Puoi dare una fonte per il fatto che 'strpos' sia riservato in C? –

risposta

11

La funzione che si sta cercando potrebbe essere sia strstr o strchr. Quindi è necessario includere string.h. Non ci sono archi nell'interfaccia POSIX.

3

Sì. Si chiama strstr, relative al strpos come (pseudo-codice):

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

Probabilmente dovrebbe essere restituito -1; invece di restituire falso; per risultati validi da 0 a strlen (str) -strlen (target) ... strpos non è incluso in standard, afaik, perché il test NULL e sottrarre in genere è più efficiente inline, quindi è stato ritenuto superfluo. –

19

Qui un codice snippet completo per risolvere il tuo problema. PS: non è troppo tardi per aiutare. ;)

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

Edit: Risposta Can Vural domanda:

No. Credo davvero che sarebbe così com'è. Nel paradigma di programmazione strutturata, è prassi comune utilizzare la struttura dell'ambito come primo parametro su ogni funzione che appartiene allo stesso ambito della struttura. La funzione strstr definita in string.h segue lo stesso approccio.

Su OOP si dispone di haystack.indexOf(needle). Nella programmazione strutturata, hai indexOf(haystack, needle).

+0

Non dovrebbe essere 'strpos (" stringa "," sottostringa ")' –

+0

Can Vural, ho modificato la mia risposta includendo alcune spiegazioni aggiuntive sulla tua domanda. – Miere

0

Ho scritto la funzione strpos() da zero con la funzione position (come la funzione strpos() di PHP). Il valore di ritorno inizierà la posizione della stringa cercata. Godere! :)

In questo esempio, l'uscita di codice sarà 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

Questo è in risposta alla Miere e Can Vural. Non riesco ad aggiungere commenti, quindi aggiungerò questo come risposta.

non dovrebbe essere strpos ("stringa", "stringa") - Può Vural

Alla programmazione strutturata, hai indexOf (pagliaio, ago). Miere

Nel codice, si ha:

int strpos(char *haystack, char *needle) 

, ma bisogna anche:

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

Sono pienamente d'accordo con i "strpos int (char * pagliaio, char ago *) "dove viene prima la stringa da cercare e la stringa per cercare FOR viene seconda. Ma per me, "subsstring" (nel contesto di "uno è una sottostringa e uno è una stringa"), "sottostringa" implica che l'IT è il più corto dei due e che stai cercando di trovare "sottostringa" in " stringa."

Quindi da una parte:

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

dovrebbe essere:

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

che sarebbe lo stesso di:?

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