Pregunta

Este código muy simple:

#include <iostream>

using namespace std;

void exec(char* option)
{
    cout << "option is " << option << endl;
    if (option == "foo")
        cout << "option foo";
    else if (option == "bar")
        cout << "opzion bar";
    else
        cout << "???";
    cout << endl;
}

int main()
{
    char opt[] = "foo";
    exec(opt);
    return 0;
}

generar dos advertencia:. Comparación con los resultados de cadenas literales en el comportamiento no especificado

¿Puede explicar por qué exactamente este código no funciona, pero si cambio

char opt[]

a

char *opt

funciona, pero genera la advertencia? ¿Está relacionado con la terminación \ 0? ¿Cuál es la diferencia entre los dos declaración de opt? Qué pasa si uso calificador const? La solución es utilizar std :: string?

¿Fue útil?

Solución

arrays de char o punteros de carbonilla no son realmente lo mismo que los objetos de la clase cadena en C ++, por lo que este

if (option == "foo")

No se puede comparar la option cadena a la cadena literal "foo" que compara el Dirección de option con la dirección de la cadena literal "foo". Es necesario utilizar una de las muchas funciones de comparación de cadenas si desea saber si la opción es lo mismo que "foo". strcmp es la manera obvia de hacerlo, o se puede utilizar en lugar de std::string char*

Otros consejos

Puede utilizar el operador == para comparar cadenas sólo si se utiliza std::string (que es una buena práctica). Si utiliza char * / char cadenas estilo C [], es necesario utilizar funciones C strcmp o strncmp.

También puede utilizar el std::string::operator == comparar std::string con una cadena C:

std string foo = "foo";
const char *bar = "bar";

if (foo == bar) 
   ...

La razón por la que no funciona es porque la comparación no se puede comparar cadenas, pero punteros a carácter.

La razón por la que puede de trabajo cuando se utiliza char * es porque el compilador puede decidir almacenar la cadena literal "opt" una vez y reutilizarla para ambas referencias (Estoy seguro de que he visto una configuración del compilador en alguna parte que indica si el compilador hace esto).

En el caso del carbón opt [], las copias del compilador la cadena literal al área de almacenamiento reservada para la matriz de exclusión (probablemente en la pila), lo que hace que los punteros a ser diferente.

Renze

Parece que usted vino de Java / C # :) En cadena de C ++ es sólo un puntero a la memoria donde se almacenan los caracteres y con carbón nulo al final. Si las cadenas "ven" igual que pueden apuntar a diferentes áreas en la memoria y no serán iguales. para comprobar la igualdad o bien utilizar la clase std :: string o función strcmp C ++ C 's.

Para C ++ me gustaría utilizar el std :: string solución :

#include <iostream> 
#include <string>

using namespace std; 

void exec(string option) 
{ 
    cout << "option is " << option << endl; 
    if (option == "foo") 
        cout << "option foo"; 
    else if (option == "bar") 
        cout << "option bar"; 
    else 
        cout << "???"; 
    cout << endl; 
} 

int main() 
{ 
    string opt = "foo"; 
    exec(opt);

    exec("bar");

    char array[] = "other";
    exec(array);
    return 0; 
} 

std :: string sabe cómo crear en sí fuera de char [], char *, etc, por lo que aún puede llamar a la función de esta manera, también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top