Repository 32bit  Forum
Repository 64bit  Wiki

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.

comparazione stringhe in if (linguaggio c)

Messaggioda NicoMetal » lun giu 11, 2012 22:54

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

char *p="ciao";

if( p == "ciao" )
...
Avatar utente
NicoMetal
Linux 2.4
Linux 2.4
 
Messaggi: 366
Iscritto il: dom mag 02, 2010 17:21
Località: Verona
Nome Cognome: Nicola
Slackware: 13.37
Kernel: 3.2.2
Desktop: FluxBox - xfce

Re: comparazione stringhe in if (linguaggio c)

Messaggioda Blallo » lun giu 11, 2012 23:01

#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*.
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3234
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: comparazione stringhe in if (linguaggio c)

Messaggioda NicoMetal » lun giu 11, 2012 23:28

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
NicoMetal
Linux 2.4
Linux 2.4
 
Messaggi: 366
Iscritto il: dom mag 02, 2010 17:21
Località: Verona
Nome Cognome: Nicola
Slackware: 13.37
Kernel: 3.2.2
Desktop: FluxBox - xfce

Re: comparazione stringhe in if (linguaggio c)

Messaggioda robbybby » mar giu 12, 2012 3:44

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
robbybby
Linux 3.x
Linux 3.x
 
Messaggi: 1176
Iscritto il: sab dic 16, 2006 10:48
Località: Fra Trantor e Terminus
Slackware: 13.1 / 64 bit
Kernel: 3.3.x
Desktop: KDE 4.4.5

Re: comparazione stringhe in if (linguaggio c)

Messaggioda Blallo » mar giu 12, 2012 5:21

robbybby ha scritto:Mi sa che ti sbagli.

Giusto.
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3234
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: comparazione stringhe in if (linguaggio c)

Messaggioda StaticKing » mar gen 21, 2014 23:38

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 1.0
Linux 1.0
 
Messaggi: 3
Iscritto il: mar gen 21, 2014 22:53

Re: comparazione stringhe in if (linguaggio c)

Messaggioda StaticKing » mar gen 21, 2014 23:59

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
StaticKing
Linux 1.0
Linux 1.0
 
Messaggi: 3
Iscritto il: mar gen 21, 2014 22:53

Re: comparazione stringhe in if (linguaggio c)

Messaggioda Toni » mer gen 22, 2014 0:34

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

Re: comparazione stringhe in if (linguaggio c)

Messaggioda robbybby » mer gen 22, 2014 0:53

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
robbybby
Linux 3.x
Linux 3.x
 
Messaggi: 1176
Iscritto il: sab dic 16, 2006 10:48
Località: Fra Trantor e Terminus
Slackware: 13.1 / 64 bit
Kernel: 3.3.x
Desktop: KDE 4.4.5

Re: comparazione stringhe in if (linguaggio c)

Messaggioda Blallo » mer gen 22, 2014 0:54

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. :)
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3234
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti