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