Anzeige:
Ergebnis 1 bis 7 von 7

Thema: Problem mit Strings in C

  1. #1
    Registrierter Benutzer
    Registriert seit
    26.12.2001
    Ort
    Pulheim
    Beiträge
    28

    Problem mit Strings in C

    hi!

    also ich habe da nen kleines Problem, ich habe folgendes geschrieben:

    char eingabe[101];

    printf("Geben Sie einen Satz ein (maximal 100 Zeichen):");
    fgets(eingabe, 101,stdin);


    int i;
    int leerzeichen=0;
    for(i=0; eingabe[i]; i++){
    if(eingabe[i]==32){ //32 ist der Wert für ein Leerzeichen im ASCII-Code
    leerzeichen++;
    printf("Leerzeichen gefunden an Stelle %d\n",i);
    }
    }
    printf("Ende des String an Stelle %d", i);

    so also ich will zählen wie viele Leerzeichen in dem String vorkommen. Also das klappt auch einiger maßen nur wundere ich mich in einer Sache.
    Ich lasse mir ja am ende den Wert von i ausgeben. Ich lesen ja einen String der länge 101 ein. fgets muss doch eingentlich den Stringterminator am Ende an der Stelle eingabe[100] setzten. deswegen dürfte die schleife doch auch nur bis i=100 durchlaufen werden oder? leider stimmt das aber nicht. Es kommt immer ein andere Wert für i raus. z.b. 291. Wie kommt das. Was ist daran falsch?

  2. #2
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762
    Du bist in C, da läuft die Schleife nicht bis der String durch ist, sondern so oft, wie der Programmierer es angegeben hat. Du kannst die Schleife durch den ganzen Arbeitsspeicher jagen wenn Du willst...
    In Java würde es eine Exception geben, aber nicht in C
    I haven't lost my mind - It's somewhere on a backup-disc

  3. #3
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Also nach Ansehen des Quellcodes,und nach einem Testlauf,kann ich deine Beobachtungen nicht bestätigen.
    i ist immer <= 100.
    fgets terminiert die Zeichenkette immer mit 0.

  4. #4
    Registrierter Benutzer
    Registriert seit
    26.12.2001
    Ort
    Pulheim
    Beiträge
    28
    hmm komisch das der fehler bei dir nicht auftritt. Werde das gleich alles nochmal schritt für schritt bei mir überprüfen.

    Aber ich habe noch eine Frage, wie kann ich den Tastatureingabebuffer löschen? Ich dachte das würde mit fflush(stdin) gehen aber leider tut sich da nichts bei mir. Kennt ihr ne andere Methode den zu löschen? Also ich will den buffer löschen den scanf und fgets benutzten, das müsste doch stdin sein oder?

    bis dann

  5. #5
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Original geschrieben von AnubisTheKing

    Aber ich habe noch eine Frage, wie kann ich den Tastatureingabebuffer löschen? Ich dachte das würde mit fflush(stdin) gehen aber leider tut sich da nichts bei mir. Kennt ihr ne andere Methode den zu löschen? Also ich will den buffer löschen den scanf und fgets benutzten, das müsste doch stdin sein oder?
    http://www.mrunix.de/forums/showthre...ghlight=fflush

  6. #6
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496
    for(i=0; eingabe[i]; i++){ // <--- HIER!!!
    if(eingabe[i]==32){ //32 ist der Wert für ein Leerzeichen im ASCII-Code
    leerzeichen++;
    printf("Leerzeichen gefunden an Stelle %d\n",i);
    }
    }

    diese for kann sich NIEMALS wirklcih beenden!!!
    weil du ja eigentlich einen pointer hast und der auch gültig ist wenn i = 200 ist!!

    du musst i kontrollierenalso:
    for(i=0;i<101;i++)
    {
    .....
    }

    greetz

  7. #7
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Original geschrieben von quinte17
    for(i=0; eingabe[i]; i++){ // <--- HIER!!!
    if(eingabe[i]==32){ //32 ist der Wert für ein Leerzeichen im ASCII-Code
    leerzeichen++;
    printf("Leerzeichen gefunden an Stelle %d\n",i);
    }
    }
    diese for kann sich NIEMALS wirklcih beenden!!!
    weil du ja eigentlich einen pointer hast und der auch gültig ist wenn i = 200 ist!!
    Sicherlich kann das beenden.
    Der String hat diese Form "Hello World\0",mit \0 == 0.
    Durch den [] Zugriff kommen wir an die einzelnen Werte,und wenn wir beim \0 angekommen sind wird die for-Schleife beendet (es wird ja 0 zurückgeliefert).
    Das ist ein Standard C Idiom,das findest du überall wieder.
    Code:
    int main()
    {
    	const char *p = "Hello\0World";
    
    	while(*p)
    		printf("%c",*p++); /* gibt nur Hello aus */
    }
    Man muß natürlich garantieren können,daß der String nulltermiert ist,aber fgets garantiert das,darum verstehe ich auch die Probleme des OP nicht.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •