Frage zu strcmp()



  • Hallo,

    in meinem Buch steht strcmp() wie folgt:

    int strcmp(char str1[], char str2[])
    {
    int i
    for( i=0; str1[i] == str2[i]; ++i)
    if(str1[i] == '\0') break;

    return( str1[i] - str2[i]);
    }

    Frage:

    Wieso liefert die Funktion einen int Wert, str[i] ist doch ne ne Hex-Zahl, oder is das ne dezimal ASCII-Zahl? Aber selbst dann: <if(str1[i] == '\0') break;> setzt voraus, dass str2 länger als str1 ist ?
    Und <str1[i] - str2[i]> ist dann vollkommen abhängig von den Buchstaben/Inhalt?

    Bitte klärt mich auf

    MfG



  • jizzer schrieb:

    str[i] ist doch ne ne Hex-Zahl, oder is das ne dezimal ASCII-Zahl?

    str[i] ist ein char. Also ein Buchstabe, der intern durch eine (meist ASCII-)Zahl dargestellt wird. Hex- oder Dezimal ist eine Sache der Ausgabe, also an dieser Stelle absolut nicht relevant.

    Aber selbst dann: <if(str1[i] == '\0') break;> setzt voraus, dass str2 länger als str1 ist ?

    Schau Dir mal die Schleifenbedingung an: str1[i] kann (innerhalb der Schleife) nur dann '\0' sein, wenn str2[i] das auch ist.

    Und <str1[i] - str2[i]> ist dann vollkommen abhängig von den Buchstaben/Inhalt?

    Häh? Wovon soll es denn sonst abhängig sein als von str1[i] und str2[i]?



  • Und <str1[i] - str2[i]> ist dann vollkommen abhängig von den Buchstaben/Inhalt?

    Häh? Wovon soll es denn sonst abhängig sein als von str1[i] und str2[i]?

    Ich dachte strcmp gibt eine Aussage über die Längerelation der beiden Strings, nicht über das Zeichenverhältnis an der ersten ungleichen Stelle (was bringt diese Information?). Daher das Misverständnis.

    danke



  • jizzer schrieb:

    (was bringt diese Information?).

    Du kannst damit Worte sortieren.



  • Hättest du ein Beispiel dafür?

    mfG



  • jizzer schrieb:

    Hättest du ein Beispiel dafür?

    mfG

    void view_array ( char** a, unsigned n )
    {
    	unsigned i;
    	for ( i = 0; i<n; i++ )
    		puts(a[i]);
    }
    
    #define PPCHARSIZE(x) (sizeof(x)/sizeof(char*))
    
    int main()
    {
    	char* a[2] = {"wort_z", "wort_a"};
    	char* temp;
    
    	puts("Unsorted: ");
    	view_array( a, PPCHARSIZE(a) );
    
    	if ( strcmp( a[0], a[1] ) > 0 )
    	{
    		temp = a[0];
    		a[0] = a[1];
    		a[1] = temp;
    	}
    
    	puts("Sorted: ");
    	view_array( a, PPCHARSIZE(a) );
    
    	getchar();
    
    	return 0;
    }
    


  • lieber so:

    #define PPCHARSIZE(x) (sizeof (x) / sizeof *(x))
    


  • Ich fühle mich doch dazu verpflichtet, qsort hier wenigstens zu erwähnen:

    #include <stddef.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define ARRAY_SIZE(a) (sizeof(a) / sizeof(*a))
    
    void view_array(char const *words[], size_t n) {
      size_t i;
    
      for(i = 0; i < n; ++i) {
        puts(words[i]);
      }
    }
    
    int strcmp_ref(void const *p1, void const *p2) {
      return strcmp(*((char const *const*)p1),
                    *((char const *const*)p2));
    }
    
    int main() {
      char const *words[] = { "foo", "baz", "qux", "bar", "quux" };
    
      puts("Unsortiert:");
      view_array(words, ARRAY_SIZE(words));
    
      qsort(words, ARRAY_SIZE(words), sizeof(char const*), strcmp_ref);
    
      puts("Sortiert:");
      view_array(words, ARRAY_SIZE(words));
    
      return 0;
    }
    

    Allgemein gesprochen definiert strcmp eine totale Ordnung über Strings, die im basic execution character set kodiert sind (üblicherweise ASCII oder eine der ISO8859-Varianten). Das ist überall da von Interesse, wo du eine solche Ordnung brauchst, also die Frage stellst: "Ist String 1 'kleiner' als String 2"?

    Sortieren ist eine Anwendung, binäre Bäume sind eine andere, Priority Queues eine dritte. Es gibt ziemlich viele davon.

    Und ganz am Rande: jedes mal, wenn jemand ein String-Literal einem char* zuweist, stirbt ein süßes Kätzchen auf grausame Weise. Das heißt: Big Brother 5, süße Kätzchen: 0. :p



  • supertux schrieb:

    lieber so:

    #define PPCHARSIZE(x) (sizeof (x) / sizeof *(x))
    

    Jepp, das macht das Makro flexibler.

    seldon schrieb:

    Und ganz am Rande: jedes mal, wenn jemand ein String-Literal einem char* zuweist, stirbt ein süßes Kätzchen auf grausame Weise. Das heißt: Big Brother 5, süße Kätzchen: 0. :p

    😮


Anmelden zum Antworten