Array verständnis Problem



  • Guten Tag,
    ich lerne momentan C und beschäftige mich gerade mit den Arrays.

    Ich habe folgenden Test-Code erstellt:

    #include "stdafx.h"
    #define getch() _getch()
    
    int main()
    {
    	char text[1];
    
    	printf("Text eingeben: ");
    	scanf("%s", text);
    	printf("%c\n", text[0]);
    	printf("%c\n", text[1]);
    	printf("%c\n", text[2]);
    	printf("%c\n", text[3]);
    
    	getch();
        return 0;
    }
    

    Ich bin davon ausgegangen das der Code nicht funktionieren dürfte, da ich ein Array mit einem Feld erstellt habe und dieses über scanf mit mehr als einem Zeichen beschrieben habe.

    Wieso funktioniert es aber trotzdem?

    Bisher gehe ich davon aus das, dsss Array in etwa so funktioniert.

    char text[5] // Array mit 5 Feldern + \0
    scanf("%s", text) // Der Text wird in das Array geschieben
    

    Eingabe für scanf: Hallo
    Inhalt des Arrays:

    text[] = "H", "a", "l", "l", "0", \0
    

    Ich bin davon ausgegangen, das ein Fehler enstehen sollte, wenn das Array mit mehr Zeichen als Feldern beschrieben wird.

    Viele Grüße
    Timo



  • Tim0 schrieb:

    Ich bin davon ausgegangen, das ein Fehler enstehen sollte, wenn das Array mit mehr Zeichen als Feldern beschrieben wird.

    Genau das passiert nicht.
    In C werden keine Arraygrenzen überprüft.

    Und das ist die große Gefahr bei C.

    Tim0 schrieb:

    Ich bin davon ausgegangen das der Code nicht funktionieren dürfte,

    Es kann immer sein, dass Code der nicht richtig ist, zufällig funktioniert.
    Du darfst davon keine Rückschlüsse auf andere Compiler/Systeme ziehen.

    Du solltest auch auf die richtige Schreibweise achten.
    Text zwischen " ist ein Stringliteral und das hat automatisch ein '\0' am Ende.

    Ein Zeichen wird zwischen einfachen Strichen gesetzt '

    text[] = {'H', 'a', 'l', 'l', '0', '\0' };
    


  • Hi!
    Ich bin auch ein Anfänger!

    Ich versuche mich mal mit meinen Kenntnissen. Solche Sachen sind von dem was ich bisher lernen konnte sehr gefährlich, da du Speicher benutzt, den du nicht für deine Variable deklariert hast.

    Das bezweckst du dadurch, dass du scanf benutzt und keine Kontrolle darüber hast was der User eingibt. Durch die Eingabe wird am Ende der Zeile eine \0 hinzugefügt. Eingelesen wird dein Array solange bis die \0 auftaucht.

    Wenn eine andere Variable dem Speicher zugewiesen werden sollte wo deine \0 steht, könntest du deine Eingabe zerstören und auch das Ende des Arrays.

    Meine Angaben sind aber mit Vorsicht zu genießen, weil ich selbst noch neu bin und selbst versuche die Sachen zu lernen.

    Grüße 🙂



  • Der Standard schreibt hier von undefiniertem Verhalten, es kann alles passieren. Bei dir ist es so, dass einfach im Bereich hinter dem Array weitergeschrieben wird. Hast du Visual Studio? Aktiviere den /GS - Schalter, sodass dir Pufferüberläufe angezeigt werden können.
    Um vom Benutzer eingegebe Zeichen auf ein bestimmtes Maß zu beschränken, kannst du statt %s zB. %60s dem scanf mitgeben, sodass nur maximal die ersten 60 Zeichen gelesen werden. Funktionen wie fgets bieten dir auch eine Möglichkeit, das Gelesene zu beschränken. Beachte dazu auch, dass noch Platz für ein Nullbyte da sein muss, um das Stringende zu markieren.



  • Dabei sollte man bedenken, das C von Profis für Profis (die Autoren) gemacht wurde.
    Also für Leute, die wissen was sie tun.

    C ist eine relativ einfache Sprache. Das heißt aber nicht, dass C einfach zu programmieren ist.



  • Danke für die schnellen und ausführlichen Antworten, hat mir sehr geholfen. 🙂

    Hast du Visual Studio? Aktiviere den /GS - Schalter, sodass dir Pufferüberläufe angezeigt werden können.

    Ja, ich nutze Visual Studio, werde es das nächste mal ausprobieren.

    Viele Grüße
    Timo



  • C_Newbe schrieb:

    Das bezweckst du dadurch, dass du scanf benutzt und keine Kontrolle darüber hast was der User eingibt. Durch die Eingabe wird am Ende der Zeile eine \0 hinzugefügt.

    Das gilt für die Formatspecifier %s und %[ bei scanf .

    C_Newbe schrieb:

    Eingelesen wird dein Array solange bis die \0 auftaucht.

    Eingelesen wird, bis ein Zeichen auftaucht, das nicht zum Formatspecifier passt.
    Bei %s sind das sog. Whitespace (Leerzeichen, Tabulatoren, Zeilenvorschub/Rücklauf)



  • DirkB schrieb:

    C_Newbe schrieb:

    Das bezweckst du dadurch, dass du scanf benutzt und keine Kontrolle darüber hast was der User eingibt. Durch die Eingabe wird am Ende der Zeile eine \0 hinzugefügt.

    Das gilt für die Formatspecifier %s und %[ bei scanf .

    C_Newbe schrieb:

    Eingelesen wird dein Array solange bis die \0 auftaucht.

    Eingelesen wird, bis ein Zeichen auftaucht, das nicht zum Formatspecifier passt.
    Bei %s sind das sog. Whitespace (Leerzeichen, Tabulatoren, Zeilenvorschub/Rücklauf)

    Danke für den Nachtrag 🙂

    So lernt es sich am Besten 🙂 👍



  • Da passt der folgende "Gimmick" gut zum Thema.

    Wenn jemand behaupten sollte C zu "beherrschen", dann fragt ihn (sie), warum folgendes Beispiel funktioniert:

    Man schaue sich die Zeile "//i und vektor vertauscht, warum geht dass" an.

    Arrays sind in C versteckte Zeigerarithmetik.

    vektor[i] = *(vektor+i) = *(i+vektor) = i[vektor]

    #include <stdio.h>
    
    int main(void)
    
    {
     unsigned char i;
    
     char vektor[10];
    
     for (i=0; i <= 9; i++) vektor[i]=i;
    
     for (i=0; i <= 9; i++) printf("%d\n", i[vektor]); //i und vektor vertauscht, wieso geht das?
    
     puts("Hauptprogramm Fertig");
    
    }
    


  • Probier einfach mal aus was passiert wenn du
    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" eingibst. Da bin ich schon kurz vor root access.


Log in to reply