visual son recortar que otro mayusculas mayor importar iguales ejemplo comparar cadenas c string pointers

son - recortar string c#



C String-Usar Equality Operator== para comparar dos cadenas para la igualdad (9)

int main (int argc, **argv) { if (argv[1] == "-hello") printf("True/n"); else printf("False/n"); }

# ./myProg -hello False

¿Por qué? Me doy cuenta de que strcmp(argv[1], "-hello") == 0 devuelve verdadero ... pero ¿por qué no puedo usar el operador de igualdad para comparar dos cadenas C?


Cuando estás usando ==, estás comparando punteros. Es decir, devolverá verdadero si los dos operandos se refieren a la misma cadena en la memoria. Por lo tanto, no es adecuado para su uso en la comparación de cadenas lexicográficamente.


En C porque, en la mayoría de los contextos, una matriz "se descompone en un puntero a su primer elemento".

Entonces, cuando tienes la matriz "foobar" y la usas en la mayoría de los contextos, se descompone en un puntero:

if (name == "foobar") /* ... */; /* comparing name with a pointer */

Lo que quiere es que compare el contenido de la matriz con algo . Puedes hacerlo manualmente

if (''p'' == *("foobar")) /* ... */; /* false: ''p'' != ''f'' */ if (''m'' == *("foobar"+1)) /* ... */; /* false: ''m'' != ''o'' */ if (''g'' == *("foobar"+2)) /* ... */; /* false: ''g'' != ''o'' */

o automáticamente

if (strcmp(name, "foobar")) /* name is not "foobar" */;


En C, los valores de cadena (incluidos los literales de cadena) se representan como matrices de char seguidas por un terminador 0, y no se puede usar el operador == para comparar los contenidos de la matriz; el lenguaje simplemente no define la operación.

Excepto cuando es el operando del sizeof & operadores, o cuando se utiliza un literal de cadena para inicializar otra matriz en una declaración, una expresión con tipo "matriz de elementos N de T" tendrá su tipo implícitamente convertido ( decay) para escribir "puntero a T", y el valor de la expresión será la dirección del primer elemento de la matriz.

Entonces cuando escribes

if (argv[1] == "-hello")

el compilador convierte implícitamente la expresión "-hello" del tipo "matriz de 7 elementos de char" a "puntero a char" ( argv[1] ya es un tipo de puntero), y el valor de la expresión es la dirección del carácter ''-'' . Entonces, ¿qué == termina comparando? Son dos valores de puntero , que (lo más probable) nunca van a ser iguales, ya que "-hello" y argv[1] (muy probablemente) ocupan regiones diferentes en la memoria.

Es por eso que debe usar funciones de biblioteca como strcmp() para comparar valores de cadena.


Las cadenas no son tipos nativos en C. Lo que está comparando en ese ejemplo son dos punteros. Uno para su primer argumento, y el otro es una matriz de caracteres estáticos con el contenido de "-hello".

Realmente quieres usar strncmp o algo similar.


No puede comparar cadenas en C con ==, porque el compilador de C realmente no tiene una pista sobre cadenas más allá de un literal de cadena.

El compilador ve una comparación con un char* en cada lado, por lo que hace una comparación de puntero (que compara las direcciones almacenadas en los punteros)


Porque argv[1] (por ejemplo) es en realidad un puntero a la cadena. Entonces, todo lo que hacen es comparar punteros.


Porque las cadenas C no existen como tales. Son matrices de caracteres que terminan en a /0 .

El operador de igualdad == probará que el puntero al primer elemento de la matriz sea el mismo. No se comparará lexicográficamente.

Por otro lado, "-hello" == "-hello" puede devolver no cero, pero eso no significa que el operador == compara lexicográfico. Eso se debe a otros hechos.

Si desea comparar lexicográfico, siempre puede

#define STR_EQ(s1,s2) / strcmp(s1,s2) == 0

Leyendo más duro veo que has etiquetado como c ++. Entonces podrías

std::string arg1 ( argv[1] ); if (arg1 == "-hello"){ // yeahh!!! } else{ //awwwww }


Porque las cadenas C son una matriz de caracteres. Las matrices son simplemente punteros al primer elemento de la matriz, y cuando se comparan dos punteros usando ==, se compara la dirección de memoria a la que apuntan, no los valores a los que apuntan.


Porque no existe una cadena en C

En C, una cadena generalmente es una matriz de char, o un puntero a char (que es casi el mismo). Comparar un puntero / matriz a una matriz de const no dará los resultados esperados.

ACTUALIZACIÓN: lo que quise decir con ''no cadena C'' es, no hay cadena en C. Lo que generalmente se conoce como ''cadena C'' es independiente del lenguaje (como ''cadena Pascal''), es la representación de cadenas como nula -terminal de matriz lineal de caracteres.