strpos (posizione di una stringa dentro un’altra stringa) in c 1


Vediamo oggi come crea una funzione strpos, ovvero una funzione che data una strina restituisce la posizione della sua prima occorrenza nell’altra stringa, se non è presente restituisce -1.

In php questa funzione è già presente nelle funzioni standard, solo che invece di ritornare -1 ritorna il valore bollano false da verificare con ===, per maggiori informazioni http://www.thecsea.it/tutorial/2010/07/php-operazioni-con-le-stringhe/.

Fare una funzione del genere non è tanto difficile, in fatti basta basta controlare n volte se i caratteri successivi alla posizione i sono tutti uguali alla seocnda stringa.

In pratica:

#include<stdio.h>
#include<string.h>
#define MAX 1000
void acquisisci(char *str);
int strpos(char *str, char *search);
int main(){
    //dichiarazioni
    char str[MAX], search[MAX];
    int pos;
    
    //acquisizione dati
    printf("inserire la stringa su cui effettuare la ricerca :\n");
    acquisisci(str);
    printf("inserire la stringa da cercare :\n");
    acquisisci(search);
    
    //stampa risultati
    if((pos=strpos(str,search))==-1)
        printf("elemento non trovato\n");
    else
        printf("elemento trovato alla posizione %d\n",pos);
}

void acquisisci(char *str){
     //acquisizione
     fgets(str,MAX,stdin);
     
     //sostituzione del \n con &#92;&#48;;
     str[strlen(str)-1] = 0;
}

int strpos(char *str, char *search){
    //dichiarazioni
    int i,j,n,l;
    
    //inizializzazioni
    l = strlen(search);
    n = strlen(str)-l+1;
    
    //calcoli
    for(i=0;i<n;i++){
        for(j=0;j<l&&search[j]==str[i+j];j++);
        if(j==l)
                return i;
    }
    return -1;                
}

In pratica nel main acquisisco le due stringhe con una particolartità : dato che ho bisogno di acquisire gli spazi non posso usare scanf(“%s”,str); perché l’acquisizone si interromperebba al primo spazio, per cui l’ideale sarebbe usare la gets, solo che la gets è segnalata da gcc come una funzione pericolosa. Quindi non ho fatto altro che usare l’fgets, che è come la gets solo che bisogna specificare lunghezza del vettore nel quale memorizzo la stringa e l’input (in questo caso lo standard input cioè stdin) solo che l’fgets acquisisce anche il \n per cui ho creato una funzione che acquisisce la stringa usando fgets e poi sostituisco il \n con \0, che si trova alla posizione strlen(str)-1. questa soluzione non è la più efficiente in quanto viene “sprecata” una chiamata a funzione (strlen()), l’ideale sarebbe fare una fuznione ad-hoc con un ciclo while ed un getchar().

Detto ciò la spiegazione dell’algoritmo di strpos risulta abbastanza semplice : prima recupero le lunghezze delle due stringhe e me le memorizzo in due variabili, in modo da evitare di “sprecare” chiamate a funzioen in seguito e quindi rallentare l’esecuzione del programma, poi decremento di l-1 la lunghezza di str prché so che tanto la stringa non potrà stare in uno spazio inferiore alla sua lunghezza, evitandomi quindi in seguito iterazioni inutili.

In seguito itero n volte ed ogni volta itero l volte controllando che la stringa da cercare sia uguale alla stringa compresa tra i e i+l-1, confrontando carattere per carattere.
Se i==l vuol dire che il confronto carattere per carattere ha sempre avuto esito positivo e quidni ritorno i.
Infine se finisco di itererare ritorno -1 poiché la stringa non è stata trovata.

CC BY-SA 4.0 strpos (posizione di una stringa dentro un’altra stringa) in c by cardinale claudio is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.


Lascia un commento

Un commento su “strpos (posizione di una stringa dentro un’altra stringa) in c