strcmpi codigo c strcmp

codigo - ¿Tengo razón en que strcmp es equivalente(y seguro) para los literales?



strcpy c (9)

Todos sabemos que los desbordamientos de problemas pueden causar, y esta es la razón por la cual strn * existe, y la mayoría de las veces tienen sentido. Sin embargo, he visto código que usa strncmp para comparar los parámetros de línea de comandos de esta manera:

if(... strncmp(argv[i], "--help", 6) == 0

Ahora, hubiera pensado que esto es innecesario y quizás incluso peligroso (para parámetros más largos, sería fácil confundir los caracteres en el literal).

strncmp se detiene en nulos, y el código ya supone que argv [i] tiene terminación nula. Se garantiza que cualquier literal de cadena terminará en nulo, entonces, ¿por qué no usar strcmp?

Quizás me estoy perdiendo algo, pero lo he visto algunas veces y esta vez me intrigaba lo suficiente como para preguntar.


Como han dicho otros, strcmp() es perfectamente seguro de usar con literales. Si quiere usar strncmp() , intente esto:

strncmp(argv[i], "--help", sizeof("--help"))

Deje que el compilador haga el conteo por usted!

Esto solo coincidirá con la cadena exacta "--help". Si quiere unir todas las cadenas que comienzan con "--help" (como lo hace su código), use sizeof() - 1 para no incluir el último ''/0'' .


Por lo que sé, tienes toda la razón: no hay ninguna razón para usar strncmp en lugar de strcmp. Quizás las personas solo están siendo precavidas (no necesariamente algo malo).


Probablemente escribiría algo como esto en C (si estuviera usando strncmp mucho y no quisiera contar los caracteres):

if(... strncmp(argv[i], "--help", sizeof("--help") - 1) == 0


Probablemente no se haya hecho por seguridad. Se podría haber hecho para verificar solo el inicio del parámetro de línea de comando. Muchos programas solo comprueban el comienzo de los interruptores de línea de comando e ignoran el resto.


Sí, la presencia de literal limita el tamaño de los datos comparados al tamaño del literal. stncmp es redundante aquí.

Algunos pueden decir que strncmp es un buen hábito para entrar, pero esto se ve superado por el problema de contar caracteres.


Tienes razón.

Además, el ejemplo que proporcionó coincidiría con "--help", pero también con todo lo que comienza con "--help" (como "--help-me").

Un caso raro en el que exceso de celo == incorrecto.


eh ... técnicamente no podría suceder algo como esto?

char *cp1 = "help"; cp1[4] = ''!''; // BAD PRACTICE! don''t try to mutate a string constant! // Especially if you remove the terminating null! ... strcmp(some_variable, "help"); // if compiler is "smart" enough to use the same memory to implement // both instances of "help", you are screwed...

Supongo que este es un caso patológico y / o basura, basura afuera ("Doc, duele cuando golpeo mi cabeza contra la pared" "¡Entonces no lo hagas!") ...

(ps. Solo estoy planteando el problema: si crees que esta publicación enturbia las aguas, comenta adecuadamente y la eliminaré)


sí, es perfectamente seguro y se considera una práctica estándar. Se garantiza que los literales de cadena terminen correctamente.


¿Estás seguro de que el código no pretende coincidir en "--helpmedosoemthingwithareallylongoptionname" ?