scanf Regex – C

Ich musste einen String lesen, bis die folgende Sequenz geschrieben wurde: \ nx \ n:

(.....)\n x\n 

\ n ist das neue Zeilenzeichen und (…..) können beliebige Zeichen sein, die andere \ n Zeichen enthalten können.

scanf erlaubt, so weit ich weiß, reguläre Ausdrücke, aber ich kann es nicht schaffen, einen String bis zu diesem Muster zu lesen. Kannst du mir mit der scanf Formatzeichenkette helfen?


Ich habe etwas versucht wie:

 char input[50000]; scanf(" %[^(\nx\n)]", input); 

aber es funktioniert nicht.

Solutions Collecting From Web of "scanf Regex – C"

scanf erlaubt soweit ich weiß reguläre Ausdrücke

Leider erlaubt es keine regulären Ausdrücke: Die Syntax ist irreführend nahe, aber es gibt nichts, das der Regex bei der Implementierung von scanf . Alles, was da ist, ist eine Unterstützung für Zeichenklassen von Regex, also wird %[] implizit als []* . Aus diesem Grund liest scanf eine Zeichenfolge, die aus anderen Zeichen als '(', ')', 'x', and '\n' .

Um Ihr Problem zu lösen, können Sie eine Schleife einrichten, die die Eingabe Zeichen für Zeichen liest. Jedes Mal, wenn du ein '\n' bekommst, überprüfe das

  • Sie haben mindestens drei Zeichen in der Eingabe, die Sie bisher gesehen haben,
  • Dass das Zeichen unmittelbar vor '\n' ein 'x' , und
  • Dass das Zeichen vor dem 'x' ein anderes '\n'

Wenn alles oben Wahr ist, haben Sie das Ende Ihrer erwarteten Eingabesequenz erreicht; Andernfalls sollte die Schleife fortgesetzt werden.

scanf unterstützt keine regulären Ausdrücke. Es hat begrenzte Unterstützung für Charakterklassen, aber das ist nicht das Gleiche.

Verwenden scanf niemals scanf , fscanf oder sscanf , weil:

  1. Numerischer Überlauf triggers nicht definiertes Verhalten aus . Die C-Laufzeit darf Ihr Programm zum Absturz bringen, nur weil jemand zu viele Ziffern eingegeben hat.
  2. Einige Formatbezeichner (insbesondere %s ) sind genau so unsicher, wie sie sind, weil sie unsicher sind, dh sie werden fröhlich über das Ende des bereitgestellten Puffers hinaus schreiben und Ihr Programm zum Absturz bringen.
  3. Sie machen es extrem schwierig, Fehleingaben robust zu handhaben.

Sie benötigen für diesen Fall keine regulären Ausdrücke. Lesen Sie eine Zeile mit getline und halten Sie an, wenn die gelesene Zeile nur “x” ist. Die regulären Routinen der regulären Ausdrucksbibliothek (nicht ISO C, aber POSIX) heißen regcomp und regexec .