Prima di proseguire...
Potrebbe interessarti la nostra collezione di esercizi C risolti?
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 https://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 \0; 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.
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.
Pingback: php operazioni con le stringhe « tutorial programmazione