Entiendo que si usted tiene ‘gato’ (cadena1) y ‘perro’ (cadena2) en strcmp (esta es una pregunta) entonces el valor de retorno de strcmp sería menor que 0 (desde el ‘gato’ es léxicamente menos que ‘perro’).

Sin embargo, no estoy seguro de lo que iba a pasar con strcmp si pasó esto:

string1: 'dog'
string2: 'dog2'.

¿Qué sería de strcmp retorno? Menos que cero, cero, o mayor? Para el contexto, estoy tratando de escribir una función de comparación que compara las cadenas y quisiera cuenta para las cadenas de partida con los mismos personajes. Una cadena puede tener una extensión (tales como ‘2’ en ‘dog2’ en el ejemplo anterior).

EDIT: Esto no es un duplicado de la pregunta. La pregunta que este supuestamente es similar a la que se pregunta para qué tipo de retorno representa – estoy diciendo lo que sucede cuando las cadenas son idénticas hasta un punto, pero luego uno de ellos se detiene, mientras que el otro continúa.

  • ¿Por qué no simplemente probarlo?
  • Posibles duplicados de strcmp() devuelve los valores de c
  • Porque me he encontrado con C que las cosas no siempre son consistentes. Los tamaños de los tipos es un buen ejemplo de esto.
  • C es muy consistente, si usted tiene un comportamiento incoherente, a continuación, lamento decir que es probable que entendido algo o usando/haciendo algo mal. O ¿te refieres a como sizeof(int) que es dependiente de la implementación? Todavía es consistente, ya que se trabaja como se especifica en la parte formal de C estándar. Las cadenas, y su comportamiento, es coherente entre plataformas e implementaciones, pero me voy a dar de que la codificación de caracteres puede variar, pero el comportamiento de las cadenas y el carácter y las funciones de cadena siga siendo coherente.

4 Comentarios

  1. 5

    Devuelve la diferencia en el octeto que difiere. En su ejemplo, '\0' < '2' así que algo negativo se devuelve.

    • Oh, así que básicamente comparando el carácter nulo? Que siempre es menos que nada ¿no?
  2. 6

    Se define en el estándar de C como la diferencia entre los dos primeros de la no coincidencia de los personajes, pero la aplicación es salvaje. El único punto en común es que el valor de retorno es cero para la igualdad de cadenas, a continuación, respectivamente <0 or >0 para str1<str2 y str1>str2.
    De ISO/IEC 9899:201x, §7.23.4 funciones de Comparación:

    El signo de un valor distinto de cero devuelto por las funciones de comparación
    memcmp, strcmp, y strncmp está determinado por el signo de la
    la diferencia entre los valores de la primera pareja de personajes (tanto
    interpretado como unsigned char) que difieren en los objetos que se
    en comparación.

    Pero algunas implementaciones de cuidar para devolver valores típicos como 0, 1 and -1. Consulte decir, la aplicación de Apple (http://opensource.apple.com//source/Libc/Libc-262/ppc/gen/strcmp.c):

    int
    strcmp(const char *s1, const char *s2)
    {
        for ( ; *s1 == *s2; s1++, s2++)
        if (*s1 == '
    int
    strcmp(const char *s1, const char *s2)
    {
    for ( ; *s1 == *s2; s1++, s2++)
    if (*s1 == '\0')
    return 0;
    return ((*(unsigned char *)s1 < *(unsigned char *)s2) ? -1 : +1);
    }
    '
    ) return 0; return ((*(unsigned char *)s1 < *(unsigned char *)s2) ? -1 : +1); }

    EDITAR:
    En el Android de inicio de la biblioteca para Donut de liberación (https://android.googlesource.com/platform/bootable/bootloader/legacy/+/donut-de-prensa/libc/strcmp.c) la función devuelve 0 si las cadenas son iguales y 1 para los otros 2 casos, y sólo se utilizan las operaciones lógicas:

    int strcmp(const char *a, const char *b)
    {
        while(*a && *b) {
            if(*a++ != *b++) return 1;
        }
        if(*a || *b) return 1;
        return 0;
    }
  3. 2

    C11 citas

    C11 N1570 borrador de estándar

    Creo "dog" < "dog2" está garantizada por las siguientes citas:

    7.23.4 funciones de Comparación
    1
    El signo de un valor distinto de cero devuelto por las funciones de comparación memcmp, strcmp,
    y strncmp está determinado por el signo de la diferencia entre los valores de la primera
    par de personajes (interpretados como unsigned char) que difieren en los objetos que se
    en comparación.

    De modo que los caracteres se interpretan como números, y '\0' está garantizado para ser 0:

    A continuación:

    7.23.4.2 La función strcmp
    2
    La función strcmp compara la cadena apuntada por s1 a la cadena apuntada por
    s2.

    dice que, obviamente, se comparan las cadenas, y:

    7.1.1 las Definiciones de los términos
    1 una cadena es Una secuencia contigua de caracteres terminado por e incluyendo la primera null
    carácter.

    dice que el valor null es parte de la cadena.

    Finalmente:

    5.2.1 conjuntos de Caracteres
    2 […] Un byte con
    todos los bits a 0, llamado el carácter null, deberá existir en la ejecución básica conjunto de caracteres; es
    se usa para terminar una cadena de caracteres.

    así '\0' es igual a cero.

    Puesto que la interpretación es como unsigned char, y todos los caracteres son diferentes, el cero es el menor número posible.

  4. 1

    De hombre strcmp:

    La strcmp() y strncmp() funciones devuelven un entero menor que,
    igual a, o mayor que cero si s1 (o de los primeros n bytes de la misma)
    encuentran, respectivamente, a ser menos, igualar, o ser mayor que s2.

    Esto normalmente sería implementado como @hroptatyr describe.

    • Así que para aclarar Thomas – el carácter nulo al final de la cadena más corta es la comparación y por lo tanto el más pequeño de la cadena es ‘menos que’ el más grande?
    • Sí.
    • Tienes razón Lee 🙂

Dejar respuesta

Please enter your comment!
Please enter your name here