Supongo que debe no usar strcmp () o una de sus alternativas mejores (más seguras). Si tiene permitido usarlos, entonces úselos. No intentes reinventar la rueda si puedes evitarla, porque generalmente lo harás mal.
De hecho, strcmp () en sí es posiblemente “incorrecto”, por lo tanto strcmp_s (), strncmp (), etc., intenta solucionar los problemas en el original. Si los creadores de C no pudieron hacer una función que funcione de manera segura en todos los casos, sus probabilidades de hacerlo bien son escasas o nulas.
Entonces, hay algunos problemas aquí.
- ¿Qué es la técnica Hashing?
- ¿Cuál es la diferencia entre la implementación de HPLC y FTIR?
- ¿Cuál es el mejor algoritmo de clasificación para matrices aproximadamente ordenadas?
- ¿Qué es lo mejor que puedes hacer si te quedas atrapado en un problema en SPOJ?
- ¿Se podría explicar y crear inteligencia artificial utilizando algoritmos?
0) El problema sobre el que preguntó y que Fatih Karaoğlanoğlu ya respondió correctamente: está colocando el ‘?’ operador ternario incorrectamente y necesita moverlo hacia la derecha, fuera del corsé.
1) s1 y s2 son punteros. A menos que haya pasado dos punteros a la misma matriz, s1 y s2 siempre serán diferentes, incluso si las cadenas dentro de esas matrices son idénticas.
Por lo tanto, su función siempre devolverá falso a menos que pase la misma matriz dos veces. Sospecho que esto debería ser if (*s1 != *s2)
. O mejor, usaría esa variable i no utilizada, y haría if (s1[i] != s2[i]).
Su función devolverá correctamente false si se pasan dos cadenas terminadas en nulo diferentes.
2) Sin embargo, su función todavía nunca presionará done==true
, por lo que nunca regresará correctamente true, ya que la otra prueba también usa el puntero directamente.
Si cambia la prueba a if (*s1 == 0)
o if (s1[0] == '\0')
, entonces devolverá correctamente verdadero si se pasan dos cadenas idénticas terminadas en nulo.
3) Pero incluso entonces, su función seguirá leyendo en la memoria arbitraria si se pasan dos matrices idénticas sin terminación nula, se pasan dos punteros nulos, se pasan dos matrices vacías …
Esta es la falla que se encuentra en el corazón de strcmp (), que los métodos más modernos intentan “arreglar” al pasar el tamaño de las matrices, etc. El problema es que C no tiene forma de identificar cuánto tiempo array no es una cadena a menos que esté correctamente terminada en nulo.
Otros puntos de estilo (no errores, solo comentarios sobre el estilo):
4) ¿Por qué hacer un bucle? ¿Por qué no hacer un bucle para siempre y simplemente devolver verdadero, en lugar de establecer hecho verdadero? Lo haces devolviendo falso, después de todo.
5) ¿Por qué pasar en matrices, luego usar aritmética de puntero? ¿Qué tiene de malo un bucle for () y la indexación de matrices? (El siguiente código todavía tiene el mismo error que strcmp):
para (i = 0; s1 [i] == s2 [i]; i ++) {
if (s1 [i] == 0) {
volver verdadero;
}
}
falso retorno;
6) Aunque la pregunta se refiere a “cadenas C”, parece que no está usando C aquí, está usando C ++, aunque está usando que proporciona métodos para cadenas de estilo C terminadas en nulo.
Como está usando C ++, podría usar std :: string de . Eso significa que puede usar la propiedad de longitud para evitar el problema strcmp (), algo como:
para (i = 0; (i <s1.length) && (i <s2.length) && (s1 [i] == s2 [i]); i ++) {
if (s1 [i] == 0) {
volver verdadero;
}
}
falso retorno;
Pero en ese caso, es probable que solo estés usando ==
para la comparación de cadenas:
devuelve s1 == s2;
… lo que haría que toda la función sea redundante.
7) ¿Por qué #incluye y ?
8) Para especificar el carácter nulo al final de una cadena, se considera mejor estilo decir '\0'
lugar de 0
, ya que es más explícito sobre lo que quiere decir, a pesar de que los dos son iguales.
9) Llama a is_equal(x, y)
una vez, coloca el resultado en una variable test_result
y luego vuelve a llamarlo para el ternario. También puede usar el valor en su variable en el ternario:
((test_result == esperado)? “pasar”: “fallar”)
10) Si pensabas que los otros eran tontos, esto podría ser lo peor: en general, realmente me gusta tu uso del espacio en blanco. Creo que la mayoría de los programadores no piensan lo suficiente sobre los espacios en blanco correctos.
Pero coloca espacios alrededor de la mayoría de los operadores, como ==,! =, -, <<, etc. Y en su llamada a testequal, y en su salida de la llamada test_equal, coloca un espacio después de cada coma en una llamada a método. Pero eres inconsistente: en tus otras llamadas a test_equal (x, y) no tienes un espacio después de la coma.
También preferiría ver un espacio antes de abrir llaves, pero es probable que muchas cosas sean solo una preferencia personal: eres consistente en no tenerlo allí, así que está bien 🙂
Si tiene un documento de “estilo de casa”, use el mismo espacio que dicta; de lo contrario, copia a tu maestro, porque eso te dará las mejores calificaciones 🙂