Frage zu Strings



  • Hallo,
    wir sollen als Hausaufgabe eine eigene Funktion schreiben die, die Länge eines Strings bestimmt.
    Bis jetzt sieht es bei mir so aus:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int main()
    {
    char string[256];
    strcpy(string,"TEST");

    int i=0;
    while(i<=256)
    {
    char lenghttest[i];
    if(lenghtteststring) // hier möchte das wenn beide gleichlang sind
    // dann soll er ausgeben
    {
    printf("The length of the string is %d. \n" ,i);
    break;
    }
    i++;
    }

    system("PAUSE");
    return 0;
    }



  • Ich muss dazu sagen, dass ich noch ziemlicher Anfänger bin in C/C++.
    Und die Funktion strlen dürfen wir ja nicht benutzen. Und im Internet finde ich immer nur "nimm doch strlen", wenn ich in Foren etwas lese.



  • Hi

    1. [ cpp ]-Tags verwenden!

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main()
    {
        char string[256];             // Oder, weil du die Zeichenkette sowieso nicht veränderst:
        strcpy(string,"TEST");        // char string[ ] = "TEST";
    
        int i=0;                      // sieht aus wie eine for-Schleife:
        while(i<=256)                 // for( int i = 0; i < 256; ++i ) { ...
        {                             // aber warum zum Teufel zählst du bis 256!?
            char lenghttest[i];       // ... und legst dann auch noch einen zweiten String an!?
            if(lenghtteststring)      // hier möchtest Du, dass wenn beide gleich lang sind ... was?
            //dann soll er ausgeben   // lengthteststring ist nicht definiert. Und wenn, wär Müll drin.
            {
                printf("The length of the string is %d. \n" ,i);
                break;
            }
            i++;
        }
    
        system("PAUSE");              // Dafür gibt es um einiges elegantere Möglichkeiten
        return 0;                     // Ist überflüssig, da main 0 zurückgibt, wenn man nix zurückgibt
    }
    

    2. Sollst Du eine Funktion schreiben:

    #include <stddef.h>                 /* size_t */
    #include <stdio.h>                  /* printf( ) */
    
    size_t my_strlen( const char * str ) {
    
        size_t length = 0;
    
        if( str )                       // nur, wenn str ein gültiger Zeiger ist
            while( *str++ )             // solange das Zeichen *str null ist, nächstes Zeichen
                ++length;               // und weiterzählen...
    
    	return length;              // den ermittelten Wert zurückgeben
    }
    
    // Anwendung:
    
    int main( ) {
    
        char string[ ] = "Hello, World!";
    
        printf( "my_strlen( %s ) = %u\n", string, my_strlen( string ) );
    }
    

    greetz, Swordfish



  • Swordfish schrieb:

    ...
        char string[256];             // Oder, weil du die Zeichenkette sowieso nicht veränderst:
        strcpy(string,"TEST");        // char string[ ] = "TEST";
    ...
    

    wenn du die zeichenkette sowieso nicht veränderst, dann: *char string = "TEST";
    🙂



  • danke für deine Hilfe.
    aber^^
    1. Deine sehr elegante Lösung war die, die uns unser Lehrer schon gezeigt hatte,deswegen fällt die leider für mich flach. Mein stringlenghttest kam dadurch, dass ich eben in dem if als bedingung will, dass der wenn beide gleich lang sind das "i" ausgibt und ich nicht weiß wie man das in die Bedingung schreibt.
    Und wenn ich ne for-Schleife schreibe gibt der mir ne Fehlermeldung deswegen diese komische while-Schleife.
    Ich Zähl nur so bis 256 falls der getestete String länger ist als nur "Test".
    Und return 0; is meinetwegen überflüssig setzt mein Compiler aber automatisch und deswegen steht das da.

    Hoffe du verstehst mich jetzt ein wenig mehr.



  • dabKer schrieb:

    1. Deine sehr elegante Lösung war die, die uns unser Lehrer schon gezeigt hatte,deswegen fällt die leider für mich flach.

    dann könnteste es noch so machen:

    unsigned my_strlen (char *s)
    {
      char *p = s;
      while (*s)
        s++;
      return s - p;
    }
    

    🙂



  • dabKer schrieb:

    Deine sehr elegante Lösung war die, die uns unser Lehrer schon gezeigt hatte,deswegen fällt die leider für mich flach.

    Naja, alles andere außer Zeichenzählen ist arg künstlich umständlich...

    dabKer schrieb:

    Mein stringlenghttest kam dadurch, dass ich eben in dem if als bedingung will, dass der wenn beide gleich lang sind das "i" ausgibt und ich nicht weiß wie man das in die Bedingung schreibt.

    naja: if( strlen( string ) == strlen( stringlengthtest ) ) { ... Aber strlen sollst du ja schreiben... 😉
    Kommt noch erschwerend hinzu, dass du stringlengthtest noch nichtmal deklariert hast. Und wenn, würd' nur Müll drinstehen.

    dabKer schrieb:

    Und wenn ich ne for-Schleife schreibe gibt der mir ne Fehlermeldung deswegen diese komische while-Schleife.

    Welchen Compiler verwendest du? Probier:

    int i;
    
    for( i = 0; /* ... */; ++i ) { // ...
    

    dabKer schrieb:

    Ich Zähl nur so bis 256 falls der getestete String länger ist als nur "Test".

    Und wenn er irgendwann länger aus 256 ist?

    dabKer schrieb:

    Und return 0; is meinetwegen überflüssig setzt mein Compiler aber automatisch und deswegen steht das da.

    system( "pause" ); stört mich mehr ➡ Automatisches Schließen verhindern

    string-freak schrieb:

    wenn du die zeichenkette sowieso nicht veränderst, dann: *char string = "TEST";

    Wenn schon Pointer, dann const char *string = "TEST"; .

    <o(((°> - und troll dich!

    greetz, Swordfish



  • Zeichenketten werden mit einem sogenannten Nullzeichen abgeschlossen,
    dem '\0'.
    Am Ende einer jeden (gültigen) Zeichenkette steht also dieses Nullzeichen.
    Das Zählen der Zeichen Zeichenkette funktioniert nun so, das man in einer
    Schleife der Reihe nach 'in jeden Buchstaben reinguckt'
    und prüft ob es das Nullzeichen ist.
    Nebenbei lässt man einen Zähler laufen.
    Für jedes Zeichen, das kein Nullzeichen ist, erhöht man den Zähler um 1.
    Findet man das Nullzeichen, ist man am Ende der Zeichenkette und die
    Schleife wird unterbrochen. Der Zählerstand, also die Länge der Zeichenkette
    wird zurückgegeben. 🙂

    unsigned myStrlen( char* p )
    {
    	unsigned n=0;
    	while(*(p+n)) n++;
    	return n;
    }
    
    #include <limits.h> // INT_MAX
    int myStrlenImproved( char* p )
    {
    	int n=0;
    	while( *(p+n) && n<INT_MAX ) n++;
    	if ( n == INT_MAX )
    	{
    		fprintf( stderr, "String-length out of scope or not terminated.");
    		return -1;
    	}
    	return n;
    }
    
    int main()
    {
    	char* s = "Dummdiedummdiedumm...Keeeeekse !";
    	printf("%d\n", myStrlen(s) );
    	printf("%d\n", myStrlenImproved(s) );
     	return 0;
    }
    

    MFG Dr. S. 🙂


Anmelden zum Antworten