2016-11-19 10 views
0
while(scanf("%s",a)) 
{ 

    if(a[0]=='#') 
    break; 
    nextpermutation(a); 
} 

Diese while-Schleife funktioniert perfekt für scanf (" % s ") aber wenn i gesetzt Scanf ("% [^ \ n] s", a) in der while es läuft nur einmal Ich überprüfte den Rückgabewert der beiden scanf und sie waren die gleichen immer noch Ich habe nicht bekommen, warum das passiert ist ...Differenz zwischen Rückgabewerte von scanf ("% s) und scanf (" % [^ n] s ")

+2

Sie Sie die Bösartigkeit von 'scanf' erkennen, und dass Sie sollten stattdessen' std :: cin' benutzen? –

+1

'% s' verwirft führende Leerzeichen,'% [set] 'nicht. Beim ersten Aufruf lesen Sie bis zum Zeichen "\ n", aber nicht, das im Stream verbleibt. Beim zweiten Aufruf kann '% [^ \ n]' kein beliebiges Zeichen abrufen, da das erste Zeichen '\ n' ist. –

+0

probiere '"% 99 [^ \ n] "' - beachte das Leerzeichen am Anfang des Strings (um Whitespace zu ignorieren) und das Limit von 99 Zeichen (um den Puffer nicht zu überlaufen). –

Antwort

1

Was ist das s dort

in %[^\n]s?

tun Ihr scanf("%[^\n]s") enthält zwei Formatbezeichner in seiner Formatzeichenfolge: %[^\n] gefolgt von einem einzelnen s. Dies erfordert, dass der Eingabestrom s nach der Sequenz %[^\n] enthält. Dies ist natürlich im Verhalten gegenüber der Ebene %s nicht sehr nahe. Passende Sequenzen für diese Formate werden aus diesem Grund allein sehr unterschiedlich sein.

Beachten Sie, dass [] kein Modifikator für %s Format ist, wie Sie fälschlicherweise zu glauben scheinen. [] in scanf ist ein autarker Formatbezeichner. Meinst du nur %[^\n] durch Zufall statt %[^\n]s?

1

Die Schlacht von zwei Verlierer: "%s" gegen "%[^\n]s":

Beide Bezeich sind schlecht und gehören nicht robust Code. Weder beschränkt die Benutzereingabe und kann den Zielpuffer leicht überlaufen.

Die s in "%[^\n]s" dient keinem Zweck. @Jonathan Leffler. So wird "%[^\n]" überprüft, das ist immer noch schlecht.

"%s" verbraucht führenden Leerraum. "%[^\n]" nicht @Igor Tandetnik

"%[^\n]" liest nichts, wenn die Hauptfigur ein '\n' ist, a unverändert oder nur selten in einem unbekannten Zustand zu verlassen.

"%[^\n]" liest alle Zeichen außer '\n'.

"%s" liest alle führenden Leerzeichen, verwirft sie und liest und speichert alle Nicht-Leerstellen.


Bessere fgets() zu verwenden, um Benutzereingabe zu lesen und es dann analysieren.

Beispiel: eine Eingabezeile, einschließlich Leerzeichen zu lesen:

char a[100]; 
if (fgets(a, sizeof a, stdin) == NULL) Handle_EOF_or_Error(); 

// if the potential trailing \n is not wanted 
a[strcspn(a, "\n")] = '\0'; 
Verwandte Themen