Newsgroup: it.comp.lang.c++
Titolo: paragone stringhe

Ciao ragazzi
osservate il seguente listato:
void main()
{
char esploratore[15] = "Colombo";
char mioesploratore[15];
cout << "chi ha scoperto l'America? " << endl;
cin >> mioesploratore;
cout << esploratore << " " << mioesploratore << endl;
if(mioesploratore == esploratore)
{
 cout << "BRAVO!!!" << endl;
}
}
Se io iserisco Colombo, e il programma stampa in seguito Colombo Colombo,
dimostrando che le stringhe sono uguali, non c'e' verso di fargli dire
"BRAVO".
Il ciclo if non vede le stringhe uguali.
Perche?
Come rimediare senza usare funzioni di stringa?
grazie
ciao

 Come rimediare senza usare funzioni di stringa?
Prima cosa if non e' un ciclo!
Poi se usi le STRINGHE, ovvero
string esploratore="Colombo";
e NON char[15] allora il tuo if funzionera' come vuoi tu.
Con i char[15] quando usi == non fai altro che confrontare il loro indirizzo
in memoria (del primo elemento) che, per forza di cose, e' DIVERSO!
Ecco perche' non ti stampa bravo!
I casi sono 2;
1) o usi string al posto di char[15]; (devi includere <string>)
2) usi strcmp() per confrontarle invece di == (devi includere <cstring>).
Tommy


Intendi dire senza strcmp()? Hai provato con
#include <string>
if(std::string(mioesploratore) == std::string(esploratore))
? O ancora meglio, definendo le due variabili mioesploratore e
esploratore di tipo std::string invece che array di caratteri?
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

 Come rimediare senza usare funzioni di stringa?
Perchč non stai usando la classe string, bensě le "stringhe" char* del C e 
quindi il confronto corretto č
if (!strcmp(mioesploratore,esploratore))
Altrimenti usa degli oggetti string.
-- 
"Any sufficiently advanced technology is indistinguishable from magic."
                                                            Arthur C. Clarke

 Come rimediare senza usare funzioni di stringa?
Cioe`?
Le stringhe si confrontano con l'operatore == delle stringhe. 
Uno particolarmente masochista puo` anche confrontarle carattere per
carattere, tenendo conto anche della lunghezza delle stringhe.
        Mauro
-- 
E` in corso la votazione per creare it.sport.atletica
Se sei interessato vota su news:it.news.votazioni

 
Gli array di char SONO stringhe, in stile C...NON lo sono in stile C++

 Gli array di char SONO stringhe, in stile C...NON lo sono in stile C++
Stile? Uhm, mettiamola cosi': in C il tipo stringa non esiste, quindi
penso sia piu' corretto dire che le stringhe sono array di char (magari
con classe di allocazione statica) e non viceversa.
--
Not in my name

 writes:

Le definizioni dei termini usati quando si parla di C++ non dipendono
dallo stile.  
In C++ per stringa si intende std::string, mentre gli array di
caratteri si chiamano 'C-style string', e le sequenze di caratteri fra
doppi apici 'string-literal'. 
Poi uno puo` anche avere un suo "stile" e chiamare stringhe i
deque<char>, array i vector e vettori i valarray, ma difficilmente
riuscira` a parlare con altri programmatori C++ senza fare confusione.



Questione più che altro filosofica, ma molti tra gli autori più
considerati la pensano diversamente affermando che in C non esiste il
tipo stringa di caratteri.


>>Nel programma non c'e` nessuna stringa.
La tua era una provocazione.... ;-)
Propriamente hai ragione, ma cavolo, sei stato esagerato e non ti deve fare
strano che poi la gente ti risponda...
Inoltre spiegami la differenza tra la frase che hai criticato:
"Gli array di char SONO stringhe, in stile C"
e la tua :
"mentre gli array di caratteri si chiamano 'C-style string'"
Sei pignolo;-) State dicendo la stessa cosa ma... non ti va bene la sua
affermazione solo perche' lui stressa la parola stringa e tu no!
Mah, ho fatto la mia provocazione, ora vo a letto felice :-)
Tommy

 tipo stringa di caratteri.
Il tipo di dato stringa non esiste di certo in C. E' prassi comune pero'
chiamarle stringhe.
Tommy

 chiamarle stringhe.
Ma questo genera poi la confusione per cui vediamo spesso cose come
char stringa1[ 80 ], stringa2[ 80 ];
...
if ( stringa1 == stringa2 ) ...


 "mentre gli array di caratteri si chiamano 'C-style string'"
Anche se i nomi sono simili, sono due cose diverse, "C-style string"
non e` un sottoinsieme di "string".
Le stringhe non sono stringhe-C e le stringhe-C non sono stringhe.
La scelta dei nomi non e` particolarmente felice, ma e` quella usata
in C++, e usare nomi diversi (o scambiare i nomi) puo` generare
confusione.  Nel caso di questo thread e` evidente dall'esempio di
cosa si sta parlando, ma non e` sempre cosi`.


 wrote
Mah, stai facendo filosofia sui nomi.

 
Ad ogni modo, entrambe le espressioni in questione sono infelici.
Non tutti gli array di char possono essere trattati come C-string.
(Non credo sia necessario spiegarne il motivo.)
Max

 if ( stringa1 == stringa2 ) ...
La colpa e' da attribuire a:
- Le 'C-style string' che sono poco intuitive
- Il fatto che chiamarle stringhe sia motivo di confusione
- Il fatto che chi fa questo errore non ha comprato un buon libro o non lo
sta studiando approfonditamente.
Tommy



Beh, in C come tipo stringa si utilizzavano gli array di char, quindi si
potrebbe considerare cosě. Ma queste sono solo parole, quindi...usa la
<string> e vivi felice!:-)


 
Beh, il concetto di stringa č una sequenza di qualcosa, quindi una
stringa di caratteri č una sequenza di caratteri...ma cmq come hai detto
tu č una questione filosofica e non mi pare il caso sprecare altra banda
per cavolate del genere, quindi mi fermo qui!:-)



Soprattutto l'ultima. Chi conosce il C sa cosa deve fare. Chi conosce il
C++ sa cosa deve fare (usare string). Chi non conosce nessuno dei due
sbaglia... :-)

 si chiamano 'C-style string', 
ehm...traduzione: stringhe in stile C :-)

 Mah, stai facendo filosofia sui nomi.
 
E a me con l'ADSL mi sta bene, a quelli col modem a 33K non saprei :-)

 ma cmq come hai detto tu è una questione filosofica 
Non e` una questione filosofica, e` una questione pratica.  Se tutti
chiamano le cose con lo stesso nome ci si capisce, se ognuno sceglie
il nome che gli piace di piu` (o che gli sembra piu` "giusto") non ci
si capisce piu` se si fa solo confusione.
Per questo motivo nel C++ molti termini hanno un significato preciso
definito dallo standard o dall'uso comune dei programmatori.  Spesso
il significato tecnico di un termine e` un po' diverso da quello
classico, e a volte e` poco intuitivo (es. un "null pointer constant"
non e` un "null pointer" e nemmeno un "pointer").


 Non tutti gli array di char possono essere trattati come C-string.
Infatti. Ecco perché, in ogni caso, array_di_char != stringhe. Gli array
di caratteri sono tipi del linguaggio mentre le stringhe (quelle del C)
sono solo particolari insiemi di dati (zero terminated).


         Mauro
Il significato "standard" nel senso di uso comune di "stringa" è un
allineamento di caratteri. Comunque lo consideri. Se poi parli di
"stringa C++" allora è quella definita in <string> e nessun'altra. Ma
allo stesso modo i programmatori C chiamano "stringa" un array di char.

 
Si definisce "stringa" un allineamento di zero o più caratteri...è alla
base di qualunque grammatica. Naturalmente se consideri le stringe del
C++, allora sono quelle definite in <string> e nessun'altra.

 è alla base di qualunque grammatica.
E' un discorso diverso. In grammatica non si parla mai di array di
caratteri. I simboli grammaticali non sono array di caratteri ma,
appunto, simboli.
