La stringa non è un tipo primitivo, ma derivato; è un array di caratteri, cioè un “insieme” di char; ogni singolo carattere è individuato da un indice di posizione (partendo da 0):
DICHIARAZIONE CON LUNGHEZZA MAX COSTANTE
#include <stdio.h>
#define MAX 30 // definisco la lunghezza massima della stringa main(){ char nome[MAX],cognome[MAX];
// in dichiarazione posso assegnare direttamente i caratteri char nome1[30]= {'e','n','r','i','c','a'}; // oppure l'intera stringa; MA SOLO QUI, non in sezione esecutiva char nome2[30]="enrica"; //INPUT E OUTPUT printf("inserire nome: "); scanf("%s",nome);
printf("Hai inserito %s \n",nome);
... }
Notate che nella scanf manca il carattere & (che indica l'indirizzo di memoria della variabile in cui memorizzare il valore inserito da tastiera): in effetti il nome di una stringa (e di un qualsiasi array) indica l'indirizzo di memoria del primo elemento, cioè, in questo caso, del primo carattere della stringa.
Mettendo la &, il compilatore genera un warning (cioè un avvertimento), ma compila comunque correttamente il programma:
scanf("%s", &nome); // Il compilatore accetta anche questa versione
Usando la scanf l'acquisizione termina al primo spazio: ad esempio acquisisce "enrica", ma non "enrica maria";
Per acquisire stringhe formate da più parole devo usare:
gets(nome);
Quando viene acquisita una stringa, il sistema aggiunge un carattere terminatore di stringa '\0' che consente di rileggerla correttamente (quindi tale carattere deve essere considerato quando si dichiara la stringa con la dimensione: se ho una stringa che deve contenere 5 caratteri, dovrò dichiararla di lunghezza 6).
Se ho dichiarato char stringa[10] e avendo acquisito “enrica”, viene aggiunto il terminatore
È possibile accedere al singolo carattere di una stringa riferendosi alla sua posizione:
stringa[0] è il primo carattere 'E'; stringa[3] è il 4° carattere 'I'; stringa[i] è il carattere in posizione i (con i tra 0 e la sua dimensione effettiva).
Talvolta, facendo input da tastiera, può accadere di non riuscire ad acquisire la stringa successiva perché il buffer è pieno (ed es. il buffer di tastiera contiene '\n').
È necessario usare fflush per svuotare il buffer di tastiera
fflush(stdin); printf("inserire cognome: "); scanf("%s",cognome); // Il compilatore accetta anche scanf("%s",&cognome); printf("%s\n",cognome);
utilizzando la libreria string.h, possiamo trattare le stringhe come un tipo primitivo utilizzando apposite funzioni:
LUNGHEZZA effettiva ("logica") delle stringhe: funzione strlen
La funzione strlen (da string.h) restituisce la lunghezza (cioè il numero di caratteri) di una stringa ricevuta come parametro.
Il suo prototipo è: int strlen(char* s);
n1=strlen(nome); n2=strlen(cognome); printf("numero caratteri effettivi del nome: %d\n",n1); printf("numero caratteri effettivi del cognome: %d\n",n2);
CONFRONTO tra le stringhe: funzione strcmp
La funzione strcmp (da string.h) confronta le due stringhe ricevute come parametro, restituendo:
-1 se la prima stringa è alfabeticamente prima della seconda
1 se la prima stringa è alfabeticamente dopo la seconda
0 se le stringhe sono uguali
Il confronto è case sensitive, cioè la stringa "Enrica" è considerata diversa da "enrica".
Il suo prototipo è: int strcmp(char* s1, char* s2);
n=strcmp(nome,"pippo"); printf("valore del confronto: %d\n",n); if(n==0) printf("Hai inserito pippo\n");
COPIA di stringhe: funzione strcpy
La funzione strcmp (da string.h) copia una stringa (sorgente) in un'altra stringa (destinazione), restituendo un puntatore alla stringa destinazione.
Il suo prototipo è: char* strcpy(char* destinazione, char* sorgente);
L'esempio seguente copia la stringa "ciao" nella variabile stringa nome.
strcpy(nome,"ciao");
CONVERSIONE MAIUSCOLO/MINUSCOLO di stringhe: strupr/strlwr
ATTENZIONE: queste funzioni non fanno parte dello standard C, ma esistono solo in ambiente Windows.
Anche se sono considerate deprecate (cioè obsolete), possono essere utili per gestire l'interfaccia a caratteri del terminale.
La funzione strupr (da string.h, ma solo in ambiente Windows) converte in maiuscolo una stringa ricevuta come parametro.
Il suo prototipo è: char* strupr(char* s);
La funzione strlwr (da string.h, ma solo in ambiente Windows) converte in minuscolo una stringa ricevuta come parametro.
Il suo prototipo è: char* strlwr(char* s);
strupr(nome); //converte la stringa nome in maiuscolo strlwr(nome); //converte la stringa nome in minuscolo
CARATTERE in POSIZIONE i
printf("%c\n",nome1[0]); //primo carattere, iniziale printf("%c\n",nome1[strlen(nome1)-1]); //ultimo carattere, in posizione strlen(...)-1
Come accennato prima, in realtà una “stringa” è un array di char (dato strutturato) e come tale può essere trattato;
esempio: acquisisce una stringa e stampa i singoli caratteri andando a capo dopo ciascuno di essi.
#include <string.h> // libreria per le funzioni su stringa
main() { char s[20]; int i; printf("inserire stringa: "); gets(s); for(i=0; i<strlen(s); i++) //oppure for(i=0;s[i]!=’\0’;i++) printf("%c\n",s[i]); }
Per i problemi della selezione territoriale di solito conviene trattare le "stringhe" come array di char e lavorare sui singoli caratteri (esempio);
se si utilizzano le funzioni della string.h (non ANSI.standard) c'è il rischio che il compilatore del sistema di gara non le riconosca!