HOWTO · C
Controlla se la stringa contiene una sottostringa in C
In questo articolo viene illustrato come verificare se una stringa contiene una sottostringa in C
In questa pagina
Per verificare se una stringa C terminata da null contiene una sottostringa esatta e sensibile alle maiuscole, chiama strstr da <string.h>. La funzione restituisce un puntatore alla prima corrispondenza oppure NULL se non ne trova. Gli esempi qui sotto sono stati eseguiti e hanno stampato Substring found.; l’etichetta resta in inglese nei blocchi di output invariati.
Verificare una sottostringa con strstr
Passa la stringa completa come primo argomento e il testo da cercare come secondo. Verifica direttamente il puntatore restituito; non stamparlo come indirizzo, perché il suo valore dipende dal processo. strstr è dichiarata nell’header C standard <string.h> e confronta i caratteri esattamente, comprese le maiuscole e le minuscole.
Questo programma cerca welcome in una frase e stampa un messaggio stabile per indicare se ha trovato o meno una corrispondenza. L’etichetta mostrata nell’output resta in inglese.
#include <stdio.h>
#include <string.h>
int main(void) {
const char *text = "Hello, welcome to C.";
const char *needle = "welcome";
if (strstr(text, needle) != NULL) {
puts("Substring found.");
} else {
puts("Substring not found.");
}
return 0;
}
Substring found.
Il puntatore restituito indica il primo carattere corrispondente in text, quindi puoi usarlo per esaminare la stringa o continuare la ricerca da quella posizione. Un puntatore diverso da null indica che esiste una corrispondenza. Se il testo da cercare è "", strstr restituisce l’inizio di text: tieni conto di questo comportamento standard se, nella tua applicazione, una ricerca vuota non deve essere considerata una corrispondenza.
Cercare una sottostringa con un ciclo
Una ricerca manuale rende esplicito il confronto e offre un punto in cui aggiungere comportamenti specifici dell’applicazione. La funzione seguente accetta due stringhe non nulle e terminate da null e restituisce 1 se trova il testo cercato, oppure 0 in caso contrario. Controlla le lunghezze prima di sottrarle, evitando un underflow unsigned quando il testo cercato è più lungo della stringa di input. Considera una stringa di ricerca vuota come una corrispondenza, in linea con strstr.
#include <stdio.h>
#include <string.h>
int contains_substring(const char *text, const char *needle) {
size_t text_len = strlen(text);
size_t needle_len = strlen(needle);
if (needle_len == 0) {
return 1;
}
if (needle_len > text_len) {
return 0;
}
for (size_t i = 0; i <= text_len - needle_len; ++i) {
size_t j = 0;
while (j < needle_len && text[i + j] == needle[j]) {
++j;
}
if (j == needle_len) {
return 1;
}
}
return 0;
}
int main(void) {
const char *text = "Hello, welcome to C.";
const char *needle = "welcome";
puts(contains_substring(text, needle)
? "Substring found."
: "Substring not found.");
return 0;
}
Substring found.
Il ciclo esterno prova ogni posizione iniziale in cui può entrare l’intero testo da cercare. Il ciclo interno avanza finché i caratteri nelle posizioni corrispondenti coincidono. Se raggiunge la lunghezza del testo cercato, la funzione ha trovato una corrispondenza completa. Questo metodo semplice è utile per imparare o personalizzare la ricerca; per i normali confronti esatti, preferisci la funzione della libreria standard, a meno che tu non abbia motivo di mantenere un’implementazione personalizzata.
Verificare una sottostringa ignorando maiuscole e minuscole
La libreria standard C non definisce una funzione per cercare sottostringhe ignorando maiuscole e minuscole. Sui sistemi GNU, strcasestr cerca senza distinguere tra maiuscole e minuscole ed è disponibile come estensione GNU. Definisci _GNU_SOURCE prima di includere gli header per richiederne la dichiarazione sui sistemi che usano questa macro di verifica delle funzionalità. Questa funzione non fa parte dello standard C portabile: prima di usarla, verifica che sia disponibile sulla piattaforma di destinazione.
Questo esempio completo usa testo ASCII e mostra la chiamata specifica di GNU. Stampa Substring found.; l’etichetta resta in inglese nel blocco di output invariato.
#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
int main(void) {
const char *text = "Hello, Welcome to C.";
const char *needle = "welcome";
if (strcasestr(text, needle) != NULL) {
puts("Substring found.");
} else {
puts("Substring not found.");
}
return 0;
}
Substring found.
Per scrivere codice portabile, implementa la ricerca senza distinzione tra maiuscole e minuscole definendo esplicitamente una politica per i caratteri, invece di modificare silenziosamente le stringhe di input. La funzione tolower può essere utile per testo trattato come sequenza di byte, ma il suo argomento deve essere EOF oppure un valore rappresentabile come unsigned char, e il comportamento dipende dalla locale C attiva. Questo approccio, da solo, non esegue il case folding Unicode. Scegli una libreria e una politica testuale adatte ai dati che il tuo programma deve elaborare.
Gestire i casi limite e scegliere un metodo
Sia strstr sia il ciclo qui sopra cercano in stringhe terminate da null e confrontano sequenze di caratteri esatte. Se l’ago è più lungo del testo, non può esserci una corrispondenza. Se l’ago è vuoto, strstr trova una corrispondenza all’inizio; anche l’implementazione con ciclo segue questa convenzione. Aggiungi un controllo esplicito se la tua applicazione richiede una regola diversa. Il ciclo richiede puntatori non null, proprio come le funzioni standard per le stringhe richiedono argomenti validi.
strstr restituisce la prima occorrenza. Per trovare quelle successive, continua la ricerca dal carattere dopo la corrispondenza precedente e l’intera lunghezza dell’ago, assicurandoti che l’ago non sia vuoto affinché la ricerca avanzi. Se ti interessano le corrispondenze sovrapposte, riparti invece dal carattere successivo alla posizione iniziale della corrispondenza precedente. La scelta dipende dal fatto che le occorrenze possano condividere caratteri.
Per la normale verifica esatta e sensibile alle maiuscole, usa strstr: è concisa e fa parte dello standard C. Usa un ciclo manuale quando vuoi mostrare il funzionamento della ricerca o personalizzare il confronto, documentandone le ipotesi sugli input. Ricorri a strcasestr solo quando l’estensione GNU è disponibile e il suo comportamento su byte e locale è adatto al testo. strpbrk non è un’alternativa per cercare una sottostringa esatta: verifica se nell’input compare uno qualsiasi dei caratteri di un insieme e risponde a una domanda diversa.