Newsgroup: it.comp.lang.c
Titolo: Aiuto: Comparare due stringhe.

Salve!
Innanzitutto vorrei presentarmi come un assoluto neofita del C.
Sto facendo qualche programma per testare i cicli iterativi e le varie 
istruzioni comuni ai vari linguaggi di programmazione.
Facendo un programma che utilizza l'istruzione if mi sono imbattuto in un 
problema:
Ho dichiarato la variabile sv_Risposta cosě:
    	char sv_Risposta[20];
ma, dopo averle dato il valore "Ciao" utilizzando la funzione gets(), la 
seguente istruzione non funziona a dovere, in quanto questo if viene letto 
ma vengono eseguite le istruzioni nell'else.
    	if (sv_Risposta == "Buongiorno" || sv_Risposta == "Ciao")
    	{
    	  printf("%s anche a te\n", sv_Risposta);
    	}
    	else
    	{
    	  printf("Ciao ciao.\n");
    	}
Pare che il problema sia dovuto alla comparazione delle stringhe, infatti 
la variabile effettivamente in fase di debug viene letta dal compilatore 
come contenente la stringa "Ciao".
Che fare?
Vi ringrazio infinitamente!
-- 
Andrea Zwirner
yuppi...@yahoo.it
"Poni ciň che sei nel minimo che fai."

 Che fare?
studiarti un buon libro di C.
la comparazione di stringhe in C non si fa con il doppio uguale, ma con le 
funzioni strcmp(char *, char *) o strncmp(char *, char *, unsigned int), 
che ritornano zero se le stringhe sono uguali.
Inoltre il tuo programma e' prono a crash per buffer overflow, ma questa e' 
un'altra storia.

Che fare?
Leggere un buon testo sul linguaggio ;)
A parte gli scherzi, la lettura di un manuale puo' chiarirti tanti
dubbi di questo tipo.
Io ti consiglierei :
Brian W. Kernighan - Dennis M. Ritchie, "Linguaggio C", II edizione.
Molte persone parlano bene di :
Kelley - Pohl, "C didattica e programmazione".
che pero' non conosco personalmente.
Il tuo problema e' molto comune tra coloro alle prime armi col
linguaggio ed e' dovuto al fatto che in C non esistono le stringhe
come tipi predefiniti e quindi non e' possibile trattarle con i
normali operatori per i tipi predefiniti (vedi ==).
Dato che esse sono implementate come vettori di caratteri, le uniche
operazioni possibili con esse, sono quelle che lavorano su vettori di
caratteri.
La libreria standard del C contiene una serie di funzioni che lavorano
sulle stringhe, scritte apposta per venire incontro a tutti i
possibili utilizzi.
Quella che a te, ad esempio, servirebbe e' strcmp (che esegue,
appunto, la comparazione tra due vettori di caratteri).
Ti sarebbe molto utile (prima o poi dovrai farlo) approfondire la
nozione di "puntatore", necessaria per comprendere al meglio l'uso
delle stringhe.
Un esempio di utilizzo (non compilato) di strcmp e' il seguente :
#include <stdio.h>
#include <stdlib.h>
int main()
{ 
    char s1[] = "paperino" ;
    char s2[] = "topolino" ;
    if ( strcmp( s1, s2 ) == 0 ) 
       puts( "Le stringhe sono uguali !" ) ;
    else
       puts( "Le stringhe sono diverse !" ) ;
    return 0 ;
}
--
Andrea Laforgia (ICQ 87230455)
http://www.geocities.com/AndreaLaforgia
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."

 ha scritto nel messaggio
news:904616F4Dyup...@212.41.192.21...
: Salve!
: Innanzitutto vorrei presentarmi come un assoluto neofita del C.
Si vede.
: Ho dichiarato la variabile sv_Risposta cosě:
<omissis>
:     if (sv_Risposta == "Buongiorno" || sv_Risposta == "Ciao")
Questa riga non credo possa essere compilata (a causa dell'errato numero di
parentesi).
In ogni caso gli array di caratteri devono essere confrontati con la
primitiva strcmp() (o equivalente) che trovi nella apposita libreria a
runtime e che devi collegare con #include <string.h>.
susanna

parentesi).
Il numero di parentesi e' giusto.


Il numero di parentesi e' giusto.
Certo che è giusto: ho premesso di essere un neofita del C, non della 
programmazione (strutturata). :)
Ciao e grazie a tutti!
-- 
Andrea Zwirner
yuppi...@yahoo.it
"Poni ciò che sei nel minimo che fai."

 Tutor at D.S.I. University of Milan
V_/_ 'The future will not remember, the past doesn't forget.'
I'm Linux zion 2.4.2 #27 mer mar 7 11:52:14 CET 2001 i586

funzione strcmp() o strncmp(). Ricordati di includere strings.h
string.h
