2016-09-10 10 views
0

Ich möchte einige Benutzereingaben lesen und mit jedem Eingang etwas tun. Ich mache das mit diesem Code:Benutzereingabe lesen und bei leerer Zeichenfolge stoppen

char c; 
while(1){ 
    printf("input"); 
    c = scanf ("%s", &c) ; 
} 

Das funktioniert gut. Aber ich brauche es, um auch eine leere Eingabe zu akzeptieren. Aber es geht einfach weiter zur nächsten Zeile und erwartet eine nicht leere Eingabe. Wie könnte ich das tun?

aktuelle Situation:

input:asdf 
input:b 
input:c 
input:d 
input:e 
input: 

fjhkjh 

Erwartet:

input:asdf 
input:b 
input:c 
input:d 
input:e 
input:blabla 
input:f 
input: 
input: 

Wie die cmd-Konsole funktioniert wie ... UPDATE: Ich habe nicht nur eine einzige charcater gelesen, das war ein Beispiel

+0

Sie wollen '% c' anstelle von'% s', und um ein einfaches 'char' zu erhalten, ist es besser, [getchar] (http://www.tutorialspoint.com/c_standard_library/c_function_getchar.htm) zu verwenden und auszudrucken mit [putchar] (http://www.tutorialspoint.com/c_standard_library/c_function_putchar.htm), deklariere 'c' als' int' –

+1

'char c [3]; // oder mehr '..' fgets (c, sizeof c, stdin); ' – BLUEPIXY

+0

Wenn ich' c = getchar() 'verwende, wird ein' input: 'für jedes Zeichen in der Zeile vor dem ... –

Antwort

0

Zunächst einmal in Ihrem Code,

scanf ("%s", &c) ; 

ruft undefined behavior auf. , wie Sie eine eingehende Zeichenfolge innerhalb einer char nicht passen können.

Das heißt, %s überspringt die führenden Weißräume und liest die nicht-weiß-Räumen bis in die unmittelbare white-space und ignoriert die letzten weißen Raum, so dass Sie nur weiß-Räume mit %s nicht lesen.

Zitiert C11, Kapitel §7.21.6.2, fscanf(), (Hervorhebung von mir)

s Findet eine Folge von nicht-white-space Zeichen.

Wenn kein l Längenmodifizierer vorhanden ist, wird das entsprechende Argument ein Zeiger auf das Ausgangselement eines Zeichenfeldes groß genug sein, um die Sequenz und ein abschließendes Nullzeichen zu akzeptieren, die automatisch hinzugefügt werden.

So können wir deutlich sehen, ist c keine ausreichende auch nur einen einzigen char Eingang zu halten, entweder, es aus der gebundenen Zugriff wird das abschließende Null zu speichern.

Sie scheinen in getchar() oder ähnlichem zu sein.

0

Es funktioniert intern nicht so, Sie haben es als einzelnes Zeichen deklariert, aber Sie haben% s verwendet, was ein Char-Array ist. die char Sie als Eingabe, werden als Nullwerte gespeichert .. jedes Zeichen gab man abcde als null .. genommen werden, wenn Sie Zweifel haben, ein printf("%s",c); unter dem scanf();

+0

'Das Char, das Sie als Eingabe erhalten, werden als Nullwerte gespeichert.oder nicht gespeichert oder als Müll gespeichert ... Sie können das Verhalten von _undefined behavior_ nicht vorhersagen –

1

Zu allererst hinzufügen Sie nicht verwenden sollten% s zum Speichern von Eingaben in einem einzelnen Zeichen, da% s für Zeichenfolgen steht, die mit einem Nullzeichen (\ 0) enden. Verwenden Sie nicht & mit % s in scanf(). ein einzelnes Zeichen machen speichern Verwendung von:

scanf("%c",&c); 

oder

c = getchar(); 
+0

Gut zu sagen, dass' c' als '' deklariert werden sollte int 'anstelle von' char' mit 'getchar()' (um 'EOF' zu erkennen) –

+0

Ich lese nicht nur ein Zeichen –

+0

@asdf, das wurde vor Ihrer letzten Bearbeitung beantwortet, wir können Ihre Gedanken nicht lesen : P –

0

Zuerst müssen Sie getchar verwenden müssen(); oder% c in scanf für ein einzelnes Zeichen dann können Sie ein, wenn für den Test verwenden, die das eingegebene Zeichen

char c; 
while(1) 
{ 
c=getchar(); 
if(c==' ') 
    break(); 
} 

Dies ist nur für einzelne Zeicheneingabe.

Verwandte Themen