Ich bin der Annahme, dass der Code, den Sie Ihre Absicht besser präsentiert zum Ausdruck bringt als deine Worte, die auf den Angaben entsprechen. Inasmuchas Sie sagen ...
Die Abhilfe, die ich bisher gefunden habe:
char space;
fscanf(f, "%1[^\n]%[^,\n],", &space, content);
... Ich schließe daraus, dass dieser Code scheint Ihnen zu tun, was Sie wollen, und ich schließen dass Sie es als "Workaround" bezeichnen, statt als vollständig zufriedenstellende Lösung, da die Variable space
berücksichtigt werden muss.
In der Tat ist es schlimmer als das: Wann immer scanf()
erfolgreich das erste Feld übereinstimmt, ruft es undefined Verhalten durch Überschreiten der Grenzen von space
. Das passiert, weil der Feldbezeichner [
mit nicht leeren Zeichenfolgen übereinstimmt, die nach ihrem Inhalt einen Terminator haben. Aber die gute Nachricht ist, dass die Beseitigung der Notwendigkeit für die zusätzliche Variable, die Sie sowieso zu tun scheinen, dieses Problem auch lösen wird.
Der einfachste Weg, dies zu tun wäre, um die Zuordnung Unterdrückungs Modifikator (*
) mit dem entsprechenden Felddeskriptor anzuwenden:
fscanf(f, "%*1[^\n]%[^,\n],", content);
den Rückgabewert überprüfen Sie sicher sein, zu bestimmen, ob irgendetwas zu vergeben wurde content
. Es wird 1
sein, wenn eine nicht leere Zeichenfolge übereinstimmte und content
zugewiesen wurde (nach dem Zuordnen, aber nicht Zuweisen der führenden Zeilenumbruch), -1
, wenn die Datei f
anfänglich an seinem Ende positioniert war oder wenn ein E/A-Fehler auftritt, oder 0
if vor dem Zuweisen von content
tritt ein übereinstimmender Fehler auf.
aktualisieren:
Wie @chux beobachtet, das scanf
Format oben ist nichts zum Schutz gegen die Grenzen des content
im Fall Überholkupplung, dass die entsprechenden Daten sind breiter als es aufnehmen kann.Da Sie es als ein Array von 100 char
sind zu erklären, kann es bis zu 99 Zeichen aufnehmen und einen Terminator, die Sie wie so überlaufen ist nicht sichergestellt werden kann:
fscanf(f, "%*1[^\n]%99[^,\n],", content);
, dass Sie mit der Möglichkeit lässt, dass das Scannen stoppt Es wird jedoch entweder ein Zeilenumbruch oder ein Komma angezeigt, und der Rückgabewert hilft Ihnen nicht, diesen Fall von einem vollständig erfolgreichen Scan zu unterscheiden. In diesem Fall führt der Scan next zu einem übereinstimmenden Fehler (unter der Annahme, dass dasselbe Format verwendet wird). Es gibt mehr als eine Möglichkeit, das zu beheben, aber Sie sollten in Erwägung ziehen, das nachgestellte Komma aus Ihrem Format zu entfernen und stattdessen nach einem Komma zu suchen und es separat über einen Aufruf an fgetc()
zu konsumieren.
Ihr Beispielcode stimmt nicht mit Ihren Wörtern überein. Du sagst ein einzelnes * Leerzeichen *, aber du scheinst stattdessen eine * neue Zeile * zu finden. Sie sagen, Sie möchten bis zu einem Semikolon (';') scannen, aber Sie scheinen zu versuchen, bis zu einem Komma (',') zu scannen. –
Ich bin nicht mit der Newline, ich versuche genau das zu vermeiden. Aber du hast recht mit dem Komma, das habe ich schon korrigiert. –