2014-07-23 10 views
12
string s; 
s += '\0'; 
s += '\t'; 
if (s == "\0\t") 
    cout << "Yahoo"; 

Non riesco a ottenere "yahoo".Perché una stringa che contiene ' 0' e ' t' non può usare l'operatore == per confrontare con " 0 t"?

E vuol dire che se voglio controllare una stringa come questa, devo codificare in questo modo?

if (s[0] == '\0' && s[1] == '\t') 
    cout << "Yahoo"; 
+0

Perché una stringa letterale non può contenere '\ 0'. Questo è considerato come il terminatore. – EJP

+4

@EJP può contenere '\ 0', il problema è quando si utilizza il costruttore' std :: string (char const *) '. Per esempio, 'cout <<" ab \ 0c "[3]' <- 'c' –

+0

Se vuoi controllare" stringhe "come quella devi usare un' vector 'come per definizione in C++ le stringhe sono zero -terminated. – RedX

risposta

22

Si utilizza l'operatore che si confronta un std::string con un const char*. In questa funzione, si presume che const char* punti a una stringa c-terminata con valore nullo (ad esempio '\0'). Poiché lo '\t' arriva dopo il terminatore, la funzione non lo considera parte della stringa e, in effetti, non avrebbe un buon modo di essere in grado di capire che era lì.

Si potrebbe fare questo:

if (s == std::string("\0\t",2)) 

che costruirà un std::string con la stringa completa letterale (meno la terminazione '\0' che il compilatore aggiunge), e metterà a confronto la stringa con quello.

+0

Grazie! Questo è ciò di cui ho bisogno in realtà! –

5

Oltre alla risposta Benjamins. C++ 14 introduce stringhe letterali. Ti consente di specificare che una sequenza di caratteri (come "a \ 0bc") deve essere considerata come una stringa. Devi solo il suffisso s.

using namespace std::string_literals; 

if (s == "\0\t"s) 
+0

Grazie, è bello, ma non posso usare questa funzione nel mio progetto per il vincolo del compilatore. –

Problemi correlati