[C] fgets gibt mehr aus, als erwünscht

Syrill

Mitglied
Hallo! :)

Ich habe ein kleines Programm geschrieben, das Wörter aus der Standarteingabe liest und sie in eine Programmstruktur abspeichert, um sie dann weiter zu verwenden. Jedes Wort muss dazu in einer eigenen Zeile stehen, "\0" und "\n" sollen nicht mit eingelesen werden.

Mein Programm liest zwar wie gewünscht ein und speichert ab, es speichert aber nach den Wörtern oft irgendwelche Zeichen. Diese wiederholen sich dann nach anderen Worten, die zugleich eingelesen werden, an der gleichen Stelle (also bei Wörtern mit 5 Buchstaben kommen die Zeichen dann regelmäßig bsp an Stelle 6 und 7 vor).

Liest fgets zu viel ein, bzw. etwas falsches oder leere ich meine Arrays, in denen ich das Eingelesene speichere nicht richtig? :(

mfg
Syrill
 
Hi.

Man kann allerdings schonmal soviel sagen: Du machst etwas falsch.

fgets arbeitet tadellos.

Du mußt eigentlich nur das \n am Ende durch ein \0 ersetzen und dann ausgeben.

Gruß
 
hi

wenn du bspw. ein char text[5] hast und 3 zeichen einliest und anschließend an stelle text[3] das \0 zeichen löschst, weis dein programm nicht wo das Ende des Strings ist und schreibt was gerade im Arbeitsspeicher vorhanden bis er eine \0 findet

Bsp
Code:
char text[5] = { 'f', 'o', 'o', '\0', ' ' };

cout << text << endl;     //Ausgabe "foo"

text[3] = ' ';

cout << text << endl;    //Ausgabe "foo  ##" wobei # irgendwas sein kann

Wozu muss bei dir das \0 Zeichen gelöscht werden?
 
Vielen Dank für eure Antworten. Groß Code posten konnte ich nicht (Ich weiß, das gehört sich eigentlich, damit nicht rumgerätselt werden muss), weil es eine Aufgabe für die Uni war.

Am Ende lag es wohl wirklich weniger an fgets als an malloc. Als ich dieses durch calloc ersetzt habe (leider erst kurz vor der Abgabe, weil malloc in der Angabe genannt wurde :rolleyes: ), lief dann alles flüssig.

Aber wie gesagt, nochmals Danke für die Hilfe!
:)


PS: Wie würdet ihr einen String/Char-Array am besten "leeren"?
 
PS: Wie würdet ihr einen String/Char-Array am besten "leeren"?
Ein String:
C:
str[0] = '\0'; // str ist nun ein Leerstring == String der Länge 0
Ein Array leeren geht nicht. In dem Array ist immer etwas drin. Wenn du einen Füllstand verwalten willst mußt du das extra machen - mit einer extra Variablen die anzeigt wie voll dein Array ist.

Du könntest natürlich das Array mit beliebigen Werten füllen:
C:
int a[20];
memset(a, 0, 20);
Gruß
 
Ein String:
C:
str[0] = '\0'; // str ist nun ein Leerstring == String der Länge 0
Ein Array leeren geht nicht. In dem Array ist immer etwas drin. Wenn du einen Füllstand verwalten willst mußt du das extra machen - mit einer extra Variablen die anzeigt wie voll dein Array ist.
Ich dachte eher daran jede Stelle des Arrays mit '/0' zu füllen, damit es beim erneuten befüllen keine Probleme gibt, dass eventuell ein altes Zeichen wieder mit auftaucht...
Oder ist das unnötig?
(Mir wurde in der Übung nach der Abgabe gesagt, das müsse mein Fehler gewesen sein, allerdings hab ich das mit for-Schleifen an 5 verschiedenen Stellen gemacht, weil ich auch dachte es lag daran... :( )



Du könntest natürlich das Array mit beliebigen Werten füllen:
C:
int a[20];
memset(a, 0, 20);
Was genau macht dnen memset? Das Array a mit Random-Werten beschreiben?
(und geht das auch bei einem Char-Array?)
 
Ich dachte eher daran jede Stelle des Arrays mit '/0' zu füllen, damit es beim erneuten befüllen keine Probleme gibt, dass eventuell ein altes Zeichen wieder mit auftaucht...
Oder ist das unnötig?
Ja, das ist unnötig. Du mußt einen String nur ordentlich terminieren. Das macht fgets allerdings automatisch. Du hast folglich irgendetwas anderes falsch gemacht.
Was genau macht dnen memset? Das Array a mit Random-Werten beschreiben?
:suchen:
(und geht das auch bei einem Char-Array?)
Ja.

Gruß
 
Zurück