La comparación de matrices de caracteres y los literales de cadena en C++
-
08-07-2019 - |
Pregunta
Tengo una matriz de caracteres y estoy tratando de averiguar si coincide con un literal de cadena, por ejemplo:
char value[] = "yes";
if(value == "yes") {
// code block
} else {
// code block
}
Esto dio como resultado el siguiente error:comparación con el literal de cadena de resultados, en los no especificados de comportamiento.También he probado algo como:
char value[] = "yes";
if(strcmp(value, "yes")) {
// code block
} else {
// code block
}
Esto no se producen errores de compilación, pero no se comporta como se espera.
Solución
std::strcmp
devuelve 0 si las cadenas son iguales.
Otros consejos
Consulte la documentación de strcmp.Sugerencia:no devuelve un valor booleano.
ETA: ==
no trabajo en general porque cstr1 == cstr2
compara los punteros, por lo que la comparación sólo será cierto si cstr1
y cstr2
punto a la misma ubicación de memoria, incluso si se encuentran a ambos se refieren a las cadenas que son lexicográficamente igual.Lo que has intentado (la comparación de un objeto cstring literal, por ejemplo, cstr == "yes"
) especialmente no funciona, porque la norma no lo necesita para.En una razonable aplicación dudo que se iba a explotar, pero cstr == "yes"
es poco probable que tenga éxito, porque cstr
es poco probable que se refieren a la dirección que la constante de cadena "yes"
vive en.
strcmp devuelve un valor de tres estados para indicar cuál es el orden relativo de las dos cadenas. Al realizar una llamada como strcmp (a, b), la función devuelve
- un valor < 0 cuando a & Lt; b
- 0 cuando a == b
- un valor > 0 cuando a & Gt; b