Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Strings in C



AnubisTheKing
27-10-2003, 18:39
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?

SeeksTheMoon
27-10-2003, 18:59
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

wraith
27-10-2003, 19:01
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.

AnubisTheKing
28-10-2003, 15:48
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

wraith
28-10-2003, 15:57
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/showthread.php?s=&threadid=32951&highlight=fflush

quinte17
30-10-2003, 15:12
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

wraith
30-10-2003, 16:16
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.


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.