2017-07-24 5 views
1

Ich kann den Unterschied nicht verstehen. Ich benutze %[^\n]s, um Phrasen zu nehmen, die vom Benutzer eingegeben werden. Aber das funktionierte nicht, wenn ich zwei Sätze hinzufügen musste. Aber das obige tat es. Bitte hilf mir den Unterschied zu verstehen.Was bedeutet scanf ("% * [ n]% [^ n]", input_string); machen?

+0

Klären Sie Ihre Frage ein bisschen versuchen, eine machen [Minimal, vollständig und prüfbare Beispiel] (https://stackoverflow.com/help/mcve) und zeigen die Kodierung Versuche, die du bereits gemacht hast. Ihr Beispiel sollte eine Vielzahl von Beispieleingaben (die alle Aspekte veranschaulichen) und die gewünschte Ausgabe enthalten. – Akira

+0

Danke für die Eingabe Akira, ich habe die richtigen Informationen von David bekommen. Was ich meinte war, was es bedeutet, wenn wir etwas wie printf ("% [^ \ n] s") schreiben. – backbencher

Antwort

6

Die %[\n] Direktive teilt scanf() Neue-Zeile-Zeichen übereinstimmt, und die * Flagsignale, die keine Zuordnung vorgenommen werden sollen, so %*[\n] überspringt irgendwelche führenden Zeilenende-Zeichen (vorausgesetzt, es ist mindestens einer führenden \n Charakter: mehr dazu in einem Moment). Nach dieser ersten Anweisung folgt ein Leerzeichen, sodass vor der abschließenden Anweisung %[^\n], die Zeichen entspricht, bis ein Zeilenumbruch auftritt, keine oder mehrere Leerzeichen gelöscht werden. Diese werden in input_string[] gespeichert, und das Newline-Zeichen wird in dem Eingabestream zurückgelassen. Nachfolgende Aufrufe, die diese Formatzeichenfolge verwenden, überspringen dieses verbleibende Zeilenumbruchzeichen.

Aber wahrscheinlich gibt es hier keine Notwendigkeit für die %*[\n] Direktive, da \n ein Leerzeichen ist; fast dasselbe könnte mit einem führenden Leerzeichen in der Formatzeichenfolge erreicht werden: " %[^\n]".

Ein Unterschied zwischen den beiden: "%*[\n] %[^\n]"erwartet dort ein Newline am Anfang des Eingangs zu sein, und dies ohne das Spiel ausfällt und scanf() kehrt ohne Zuweisungen, während " %[^\n]" keine führende Newline erwarten, oder sogar ein führender Whitespace-Charakter (aber überspringt sie, wenn vorhanden).

Wenn Sie verwendet "%[^\n]" statt, wie es in dem Körper der Frage vorgeschlagen (beachten Sie, dass die Hinter s keinen Teil der Scanset Richtlinie), der erste Aufruf von scanf() würde Zeichen übereinstimmen, bis ein Newline angetroffen wird. Die übereinstimmenden Zeichen würden in input_string[] gespeichert werden, und die neue Zeile würde in dem Eingabestream verbleiben. Wenn dann scanf() mit dieser Formatzeichenfolge erneut aufgerufen wird, werden keine Zeichen gefunden, bevor die neue Zeile gefunden wird. Die Übereinstimmung würde daher ohne Zuweisung fehlschlagen.

Bitte beachten Sie, dass Sie immer eine maximale Breite angeben sollen, wenn %s oder %[] in einem scanf() Format-String unter Verwendung von Pufferüberlauf zu vermeiden. Bei %s oder %[] fügt automatisch den \0 Abschlusswiderstand hinzu, so dass Sie sicherstellen müssen, dass dafür Platz vorhanden ist. Für ein Array der Größe 100 sollte die maximale Breite 99 betragen, sodass maximal 99 Zeichen im Array übereinstimmen und gespeichert werden, bevor der Nullabschluss hinzugefügt wird. Zum Beispiel: " %99[^\n]".

0

In der scanf-Funktion weist '*' die Funktion an, ein Zeichen von der Eingabe zu ignorieren.

%*[\n] 

Dies teilt die Funktion, die ersten ‚\ n‘ Zeichen zu ignorieren und dann eine beliebige Zeichenfolge

Führen Sie den Code akzeptieren und ersten „ENTER“ als Eingabe geben und dann geben: „Ich fühle mich großartig !! ! " Jetzt den Puffer drucken. Sie werden bekommen, dass ich mich großartig fühle !!!als Ausgang

diesen Code-Schnipsel

int main() 
{ 
    char buffer[100]; 
    printf("Enter a string:"),scanf("%*[\n] %[^\n]', buffer),printf("buffer:%s\n", buffer); 
    return 0; 
} 
+0

Wie es jetzt ist, kompiliert dieser Code nicht (Komma-getrennte Anweisungen? Aber überprüfen Sie die Anführungszeichen). Warum sollte der Benutzer ** ENTER ** drücken müssen, bevor er die Eingabe hier eingeben kann? Lies meine Antwort oben, um es herauszufinden .... –

Verwandte Themen