char, string: übergabe. frage



  • Hallo,
    folgender Code

    int main()
    {
    	char c_2[] = "";
    
    	scanf("%s", c_2);
    	A_3(c_2);
    
    	system("pause");
    	return 0;
    }
    
    int A_3(char c_2[])
    {
    	char c_1[] = ""; int i_0 = 0, i_1 = 0;
    
    	for(i_0 = 0; i_0 < strlen(c_2); i_0 = i_0 + 1)
    	{
    		c_1[i_0] = c_2[strlen(c_2) - 1 - i_0];
    	}
    
    	printf("\t%s\n-\n\n", c_1);
    }
    

    Vom Prinzip her arbeitet der Algortihmus so wie ich mir des vorstelle. Jedoch erzeugt er bei einer Eingabe von zwei Zeichen und nur bei zwei Zeichen, am Ende ein "@".

    folgende Frage: Woran liegt das? Meiner Meinung nach kann das nur an "char c_1[] = "";" liegen, vielleicht kann mir das mal jemand genauer erklären.


  • Mod

    Nun, dein Array c_2 hat die Länge 1 und da ist die Nullterminierung schon drin. Und dann liest du etwas ein. Da du eine Zeichenkette einliest, hat diese mindestens 2 Zeichen. Mindestens ein Zeichen von der Zeichenkette und eines für die Nullterminierung. Und somit hast du bereits in der zweiten Zeile deines Programms undefiniertes Verhalten. Danach habe ich gar nicht erst weiter gelesen. Beim Überfliegen sieht es so aus, als hätte der Rest des Codes ähnliche Probleme.

    guck dir nochmal die Grundlagen an, wie das mit den Arrays funktioniert und wie in C mit Zeichenketten gearbeitet wird.



  • c_1 und c2 haben durch die leeren Klammern [] und der Zuweisung eines leeren Stringliterals "" die Länge 1.
    D.h. du kannst da keine Zeichen mehr reinschreiben.

    Strings wachsen in C nicht mit. Die haben eine einmal festgelegte Länge.



  • DirkB schrieb:

    c_1 und c2 haben durch die leeren Klammern [] und der Zuweisung eines leeren Stringliterals "" die Länge 1.
    D.h. du kannst da keine Zeichen mehr reinschreiben.

    Strings wachsen in C nicht mit. Die haben eine einmal festgelegte Länge.

    Ja, die Zuweißung der Länge für die Strings wollte Ich eigentlich umgehen, auch wenn dies nicht wirklich gut geht. So müsste Ich also noch explizit die Länge angeben.



  • 2119821 schrieb:

    So müsste Ich also noch explizit die Länge angeben.

    In C: Ja.



  • So, Ich habe jetzt beiden eine bestimmte Länge zugewießen.

    char c_2[99];
    

    und

    char c_1[strlen(c_2)];
    

    Jetzt funktioniert alles super, bis auf, wenn Ich nur ein Zeichen eingebe- dann ist die Stringlänge angeblich 3.
    - Dies hängt dann also mit der, wie SeppJ schon schrieb, Nullterminierung zusammen?
    - Gibt es dann eine elegantere Lösung, als die Eingabe von nur einem Zeichen mit einer If- Bedingung abzufangen? Wie würde diese dann aussehen?



  • Das heißt zugewiesen und nicht zugewießen.
    Und arbeite mal an der Namensgebung deiner Variablen, da bekommt man sonst Augenkrätze von.

    int A_3(char c_2[])
    {
        char c_1[100] = ""; int i_0;
    
        for(i_0 = 0; i_0 < strlen(c_2); i_0 = i_0 + 1)
        {
            c_1[i_0] = c_2[strlen(c_2) - 1 - i_0];
        }
    
        printf("\t%s\n-\n\n", c_1);
    }
    
    int main()
    {
        char c_2[100];
    
        scanf("%99[^\n]", c_2);
        A_3(c_2);
    
        return 0;
    }
    


  • Haha, das mag wohl so sein! Vielen Dank Eure Hilfe.//



  • 2119821 schrieb:

    char c_1[strlen(c_2)];
    

    Auch das kannst du so auf keinen Fall machen. strlen gibt die Länge des Strings ohne terminierendes '\0'-Zeichen zurück. Du müsstest also noch 1 dazuaddieren, wenn c2 später in c1 Platz haben soll. Dabei aber bitte beachten, dass das ganze so nur in C99 funktioniert. Arrays variabler Länge gab es in vorherigen C-Versionen noch nicht.

    Am besten wirklich nochmal Grundlagen lesen. K&R bietet sich da an. 😉


Anmelden zum Antworten