comparazione stringhe in if (linguaggio c)

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
NicoMetal
Linux 2.x
Linux 2.x
Messaggi: 380
Iscritto il: dom 2 mag 2010, 18:21
Nome Cognome: Nicola
Slackware: current64
Kernel: 4.3
Desktop: kde5 - FluxBox
Località: Verona

comparazione stringhe in if (linguaggio c)

Messaggio da NicoMetal »

È possibile fare una comparazione di stringhe in un if?
una cosa del tipo:

char *p="ciao";

if( p == "ciao" )
...

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: comparazione stringhe in if (linguaggio c)

Messaggio da Blallo »

#include <string.h>

if (strcmp(p, "ciao) == 0))
{
...
}

PS: ricorda che anche un char senza asterisco è un puntatore ad un array di caratteri. Quindi, a meno che non vuoi allocare un vettore di stringhe, non usare il char*.

Avatar utente
NicoMetal
Linux 2.x
Linux 2.x
Messaggi: 380
Iscritto il: dom 2 mag 2010, 18:21
Nome Cognome: Nicola
Slackware: current64
Kernel: 4.3
Desktop: kde5 - FluxBox
Località: Verona

Re: comparazione stringhe in if (linguaggio c)

Messaggio da NicoMetal »

jimmy_page_89 ha scritto:#include <string.h>

if (strcmp(p, "ciao) == 0))
{
...
}

PS: ricorda che anche un char senza asterisco è un puntatore ad un array di caratteri. Quindi, a meno che non vuoi allocare un vettore di stringhe, non usare il char*.
Grazie ;)

Avatar utente
robbybby
Linux 4.x
Linux 4.x
Messaggi: 1223
Iscritto il: sab 16 dic 2006, 10:48
Slackware: 13.1 / 64 bit
Kernel: 3.3.x
Desktop: KDE 4.4.5
Località: Fra Trantor e Terminus

Re: comparazione stringhe in if (linguaggio c)

Messaggio da robbybby »

jimmy_page_89 ha scritto:PS: ricorda che anche un char senza asterisco è un puntatore ad un array di caratteri. Quindi, a meno che non vuoi allocare un vettore di stringhe, non usare il char*.
Mi sa che ti sbagli.

Codice: Seleziona tutto

char *pStr = "pippo";  //ok: pStr è un puntatore a char
char c = "pippo";      //non ok: c è un carattere (un byte), non puoi assegnarlo a un puntatore, quale è "pippo"
//ma
char pStr1[10];        //ok: pStr1 è un puntatore a char, e allochi spazio per 10 caratteri. pStr1 punta al primo carattere dell'array allocato

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: comparazione stringhe in if (linguaggio c)

Messaggio da Blallo »

robbybby ha scritto:Mi sa che ti sbagli.
Giusto.

StaticKing
Linux 0.x
Linux 0.x
Messaggi: 3
Iscritto il: mar 21 gen 2014, 22:53

Re: comparazione stringhe in if (linguaggio c)

Messaggio da StaticKing »

Ragazzi, ho un problema riguardante questo fatto: ho creato un programmino di prova così strutturato:

void main()
{
char s[2];
printf("Scrivi si se vuoi che venga scritto OK, no se vuoi che venga scritto KO\n");
scanf("%s",s);
if (s=="si") printf("OK\n");
else printf("KO\n");
printf("%s %c %c\n",s,s[0],s[1]);
system("pause");
}

E' molto semplice, dovrebbe scrivere "OK" se scrivo "si" in riga di comando, "KO" altrimenti, prende in ingresso una stringa di due caratteri. Il problema è che scrive sempre "KO" anche se scrivo si. L'ultimo printf l'ho messo per vedere se il problema era nella aquisizione di s tramite lo scanf, ma a quanto pare quella va bene perchè se scrivo "si", l'ultimo printf mi scrive "si s i". Non capisco dove sbaglio...

StaticKing
Linux 0.x
Linux 0.x
Messaggi: 3
Iscritto il: mar 21 gen 2014, 22:53

Re: comparazione stringhe in if (linguaggio c)

Messaggio da StaticKing »

Problema risolto, con strcmp(s,"parola") come scritto sopra funziona, non mi è chiaro comunque come mai non si può fare semplicemente if (s=="parola"). E poi solitamente se una funzione con solo 2 output possibili (vero o falso) è vera, non si costruisce che dia valore di ritorno 1? Qui dà 0 se sono uguali... Va beh questo è solo un dettaglio comunque :-k

Avatar utente
Toni
Linux 3.x
Linux 3.x
Messaggi: 999
Iscritto il: lun 30 gen 2006, 22:08
Slackware: slackware-14
Kernel: 3.10.5
Desktop: i3
Località: milano

Re: comparazione stringhe in if (linguaggio c)

Messaggio da Toni »


Avatar utente
robbybby
Linux 4.x
Linux 4.x
Messaggi: 1223
Iscritto il: sab 16 dic 2006, 10:48
Slackware: 13.1 / 64 bit
Kernel: 3.3.x
Desktop: KDE 4.4.5
Località: Fra Trantor e Terminus

Re: comparazione stringhe in if (linguaggio c)

Messaggio da robbybby »

Codice: Seleziona tutto

char s[2];
Così allochi spazio per 2 caratteri, ma "si" e "no" sono stringhe lunghe 3 caratteri, a causa del NULL terminator, quindi stai ottenendo un bellissimo stack overflow :)
strcmp() ritorna:
0 se le due stringhe sono uguali
<0 se la prima stringa è lessicograficamente minore della seconda (più corta, oppure precede alfabeticamente la seconda).
>0 se la prima stringa è lessicograficamente maggiore della seconda (più lunga, oppure segue alfabeticamente la seconda).

Quindi non si limita a restituire 0/non 0.

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: comparazione stringhe in if (linguaggio c)

Messaggio da Blallo »

Il nome di una variabile char è un puntatore, per questo non sono comparabili.
Oltretutto una stringa è un vettore di char. Quando compari un vettore di interi li comunque analizzi cella per cella, giusto?
Così per le stringhe. :)

Rispondi