2011-06-10 18 views
19

A continuación se presenta el fragmento de código de lo que hice, puede algún cuerpo me ayude en los que he codificado erróneamente que:¿Por qué la cadena == cadena de comparación está fallando?

#include<iostream> 
using namespace std; 

void modifyName(string &name) 
{ 
    size_t sep = string::npos; 
    sep = name.find_first_of("."); 

    if(sep != string::npos) { name[sep] = '\0'; } 
} 

int main() 
{ 
    string name("test.rtl"); 
    string someName("test"); 
    modifyName(name); 

    if(someName == name) //Failing?? 
     cout<<"MATCHED"<<endl; 
    return 0; 
} 
+4

+1 por un corto independiente ejemplo, – Flexo

+1

Cuando probé la depuración de este llegué a conocer que el tribunal << name.c_str() << "..." << nombre << endl; outputs: test ... testrtl, el operador de cout '<<' funciona de forma diferente en los objetos de cadena y char *. Simplemente sentí que vale la pena compartir :). – pankiii

+1

Cuando usa 'name.c_str()' está creando una cadena c-style a partir de 'std :: string' - las cadenas estilo c tienen terminación nula. Como había insertado un nulo en el medio de la cadena, esto termina cuando c-styled. Pero un 'std :: string' puede contener cualquier valor, incluido nulo; sin embargo, un nulo generalmente no se puede imprimir, por lo que no se imprimirá ... pero tampoco significará el final de la secuencia de caracteres. – icabod

Respuesta

21

Como han dicho otros, las cadenas no coinciden, ya que una es "test\0rtl" y la otra es "test". Está bien usar == para la comparación std::string, ya que el operador está sobrecargado por igualdad de cadenas. Para hacer lo que desea, debe intentar sustituir

if(sep != string::npos) { name[sep] = '\0'; } 

con

if(sep != string::npos) { name.resize(sep); } 
+1

+1 como usar el tamaño en lugar de mi sugerencia (substr) debería ser al menos más rápido debido a que no se usa la asignación. – icabod

+0

gracias esta solución funciona bien – pankiii

+5

@pankiii: No llamaría esto una "solución" - es la forma correcta de hacer lo que está buscando. –

13

está fallando, porque no son lo mismo .. No ha "cortar" el cadena, acaba de cambiar un char en él.

someName es test, mientras name es test\0rtl (std::string le permite tener cero caracteres ('\0') en el interior)

para cortar la cadena, es necesario utilizar std::string::resize o para auto-asignar la subcadena, utilizando std::string::substr . Yo recomendaría resize.

9

En esta línea

if(sep != string::npos) { name[sep] = '\0'; } 

está modificando la cadena a ser "test\0rtl". Un std :: basic_string puede contener caracteres nulos, por lo que las cadenas no son las mismas. Se podría utilizar substr para truncar la cadena en su lugar:

if(sep != string::npos) { name = name.substr(sep); } 

Esto hará que la cadena se haga "test", lo que debería (!!) comparar correctamente.

Cuestiones relacionadas