¿Cómo puedo verificar si un valor coincide con una cadena?

Los principales se congelan mientras se aprende C aquí.

Tengo una estructura aquí con algo como:

char *sname; ........ players[i].sname 

igualando a “James”.

Necesito verificar la igualdad entre valores como ese:

 if (players[i].sname == 'Lee') 

pero no estoy teniendo mucha suerte. ¿Hay alguna función str que deba usar o hay alguna forma de arreglar mi sentencia if? No está funcionando atm.

La respuesta corta: strcmp() .

La respuesta larga: Así que tienes esto:

 if(players[i].sname == 'Lee') 

Esto es incorrecto en varios aspectos. Primero, las comillas simples significan “carácter literal” y no “cadena literal” en C.

En segundo lugar, y más importante aún, "string1" == "string2" no compara cadenas, compara char * s o punteros con los caracteres. Le dirá si dos cadenas están almacenadas en la misma ubicación de memoria . Eso significaría que son iguales, pero un resultado falso no significaría que son desiguales .

strcmp() básicamente pasará y comparará cada carácter en las cuerdas, deteniéndose en el primer carácter que no sea igual, y devolviendo la diferencia entre los dos caracteres (¡por eso tienes que decir strcmp() == 0 o !strcmp() para la igualdad).

Tenga en cuenta también las funciones strncmp() y memcmp() , que son similares a strcmp() pero son más seguras.

Deberías usar strcmp() :

 if (strcmp(players[i].sname, "Lee") == 0) { ... 

También tenga en cuenta que las cadenas en C están rodeadas por comillas dobles: "" . Los caracteres únicos están rodeados por comillas simples: '' . No estoy seguro de lo que su comstackdor podría estar haciendo con 'Lee' , pero es casi seguro que no es lo que quiere.

strcmp() buscando strcmp() desde el encabezado .

Tenga en cuenta que necesita una cadena: 'Lee' no es una cadena, sino una constante de caracteres múltiples, que está permitida pero rara vez es útil, sobre todo porque la representación la define el comstackdor, no el estándar C.

Si está buscando comparar dos cadenas, llame first a los punteros y luego a la second , luego escriba:

 if (strcmp(first, second) == 0) // first equal to second if (strcmp(first, second) <= 0) // first less than or equal to second if (strcmp(first, second) < 0) // first less than second if (strcmp(first, second) >= 0) // first greater than or equal to second if (strcmp(first, second) > 0) // first greater than second if (strcmp(first, second) != 0) // first unequal to second 

Esto, en mi opinión, deja en claro cuál es la comparación y, por lo tanto, debe usarse la notación. Tenga en cuenta que strcmp() puede devolver cualquier valor negativo para indicar “menor que” o cualquier valor positivo para indicar “mayor que”.

Tenga cuidado con el uso de strncmp() lugar de strcmp() , que se sugirió en una respuesta. Si usted tiene:

 if (strncmp(first, "command", 7) == 0) 

luego si first contiene "commander" , la coincidencia será válida. Si eso no es lo que quieres, pero quieres usar strncmp() todos modos, escribirías:

 if (strncmp(first, "command", sizeof("command")) == 0) 

Esto rechazará correctamente al "commander" .