c konsolenprogramm ?

Okay, danke für die Antwort. Aber irgendwie verstehe ich nicht, was das ganze bedeutet. Also ich bin ja noch anfänger, und übe halt gerade noch. Könntest du mir das vielleicht erklären, warum genau so? :)
 
Merke gerade einen Fehler in meinem Code.
Hier richtig

C++:
while(1)
{
    j=strlen(korrekt)-1;
    if(korrekt[j]!=10&&korrekt[j]!=13&&korrekt[j]!=-1)break;
    korrekt[j]='\0';
}

Erklärung: fgets speichert die Entertaste als Zeilenwechsel mit in den String ab.
Wenn du also mit "nein\n" statt "nein" vergleichen würdest, würde es funktionieren.

Damit man aber weiterhin "nein" verwenden kann (und nicht komplett verwirrt wird) behandle ich die Eingabe einfach sofort nach dem fgets entsprechend.

Dafür:
1)Ermittle ich zuerst, welcher Index im char-Array der letzte Eingegebene Buchstabe ist.
Gibt man zB "nein" ein, ergibt strlen 4 (weil 4 Buchstaben)
Weil bei Array aber von 0 weg gezählt wird, ist n 0, e 1, i 2 und das letzte n 3
Der letzte Buchstabe, n, ist also am Index 3 = strlen -1

2)Dann prüfe ich, ob das Zeichen am besagten Index 10 oder 13 ist.
Beide Nummern sind ca. gleichbedeutend mit dem \n, also einem Zeilenwechsel.

Wenn das letzte Zeichen keines der beiden ist, wird die Schleife abgebrochen.
Sonst wird das letzte Zeichen weggeschnitten und das Ganze wiederholt.
Es könnte ja sein, dass nicht nur ein 10/13 am Schluss war.
Die Schleife stellt sicher, das alle entfernt werden

Zum Wegkürzen des letzten Buchstaben: In C wird das Stringende durch den Code 0 gekennzeichnet, eben damit man weis wo die Eingabe aufhört.
strlen zB macht nichts anderes als jedes Zeichen durchzuprüfen, wann endlich die 0 kommt und dann hintergibt, an wievielter Stelle die 0 gefunden wurde.
In j hab ich jetzt den Index des letzten Zeichens, eins weiter wäre die 0.
Um das letzte Zeichen zu entfernen, überschreibe ich das auch einfach mit 0.
Beim Durchsuchen kommt jetzt meine neue 0 als Erste und markiert damit das Stringende.

Zum -1, das auch in der Schleife geprüft wird: Ist nur der Vollständigkeit halber da, weil fgets ja auch aus echten Dateien statt der Tastatur einlesen kann und dort eine Zeile ja auch mit dem Ende der kompletten Datei fertig sein könnte, ohne einen eigenen Zeilenumbruch noch dazu.
Ist hier nicht unbedingt nötig, schadet aber auch nicht.

Gruß
 
  • Gefällt mir
Reaktionen: yax
2)Dann prüfe ich, ob das Zeichen am besagten Index 10 oder 13 ist.
Beide Nummern sind ca. gleichbedeutend mit dem \n, also einem Zeilenwechsel.
Genauer gesagt ist '\n' == 10 (Zeilenvorschub) und '\r' == 13 (Wagenrücklauf). Man kann diese Zeichen auch gleich so hinschreiben, es gibt keinen Grund hier auf die konkreten Zahlenwerte auszuweichen.

Wenn das letzte Zeichen keines der beiden ist, wird die Schleife abgebrochen.
Sonst wird das letzte Zeichen weggeschnitten und das Ganze wiederholt.
Es könnte ja sein, dass nicht nur ein 10/13 am Schluss war.
Mehrere '\n' am Ende sind nicht möglich, da fgets beim ersten '\n' stoppt. Ein '\r' sollte überhaupt nicht auftauchen (es sei denn der Benutzer gibt es selbst ein).

Zum -1, das auch in der Schleife geprüft wird: Ist nur der Vollständigkeit halber da, weil fgets ja auch aus echten Dateien statt der Tastatur einlesen kann und dort eine Zeile ja auch mit dem Ende der kompletten Datei fertig sein könnte, ohne einen eigenen Zeilenumbruch noch dazu.
Ist hier nicht unbedingt nötig, schadet aber auch nicht.
C fügt in dem Fall aber kein Zeichen ein, das überhaupt nicht in der Datei steht. Die Überprüfung auf -1 ist also überflüssig.

Der Codeschnipsel lässt sich also so vereinfachen:
C:
j = strlen(korrekt)-1;
if (korrekt[j] == '\n')
  korrekt[j] = '\0';
}

Wenn man ganz korrekt sein will sollte man übrigens noch den Rückgabewert von fgets abfragen (der ist im Fehlerfall NULL).

Grüße,
Matthias
 
Zurück