2016-11-02 10 views
0

Ich versuche, ein kurzes Programm zu schreiben, das jedes Wort auf eine neue Zeile setzt. Die neue Zeile kann durch Tabulator, Leerzeichen oder Enter bestätigt werden. Das Ende des Programms setzt "#" in die Konsole. Ich habe das Problem, dass, wenn ich "enter" auf die Konsole setze, schreibt nächste Zeichen in der gleichen Zeile.Warum printf (" n") nicht zur nächsten Zeile geht?

Die zweite Idee ist, all dies in einer Tabelle zu machen, damit ich formatierten Text am Ende alle zusammen setzen kann. Ich kann das auch nicht herausfinden.

#include<stdio.h> 
#include <conio.h> 
#define STOP '#' 
int main() 

{ 

    char ch; 
    while ((ch = (_getch())) != STOP) { 
     switch (ch) { 
     case '\n': 
      printf("\n"); 
      break; 
     case '\t': 
      printf("\n"); 
      break; 
     case ' ': 
      printf("\n"); 
      break; 
     default: 
      putchar(ch); 
     } 

    } 

    printf("\nEND"); 
    _getch(); 


    return 0; 
} 
+1

Haben Sie überprüft, was von '_getch()' zurückgegeben wird, wenn Sie "enter" eingeben? – Martin

+2

In Windows geben Sie "\ r \ n" für eine neue Zeile aus. –

+0

@JohnnyMopp Der C-Standard erfordert 'printf (" \ n ")' nach DTRT, unabhängig davon, ob der OS-Zeilenabschluss ein einzelnes Zeichen ist. (Insbesondere müssen sowohl die Eingabe als auch die Ausgabe von FILE-Objekten, die im Textmodus geöffnet sind, zwischen '\ n' und dem Zeilenabschluss des Betriebssystems konvertiert werden.)' _getch' ist nicht Teil des C-Standards, unterliegt also nicht diesem Regel. – zwol

Antwort

3

Da "enter" gibt einen Wagenrücklauf char (\r) schlagen, nicht einen Zeilenvorschub ein.

Ich bemerkte es, wenn der Cursor am Anfang der Zeile zurücksprang, als ich "Enter" drückte.

Fix Code wie folgt (Faktorisierung die case Aussagen zu):

#include<stdio.h> 
#include <conio.h> 
#define STOP '#' 
int main() 

{ 

    char ch; 
    while ((ch = (_getch())) != STOP) { 
     switch (ch) { 
     case ' ': 
     case '\t': 
     case '\r': // what was missing 
      printf("\n"); 
      break; 
     default: 
      putchar(ch); 
     } 

    } 

    printf("\nEND"); 
    _getch(); 


    return 0; 
} 
3

Sie wahrscheinlich einen Wagenrücklauf ('\r') erhalten, das, was typischerweise erzeugt Return ist.

Also müssen Sie auch dafür überprüfen. Ihr Code kann vereinfacht werden:

int main(void) 
{ 
    while((ch = _getch()) != STOP) 
    { 
    if(ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t') 
     ch = '\n'; 
    putchar(ch); 
    } 
} 

Da wir immer sind Druck genau ein Zeichen pro Iteration, keine Notwendigkeit, mehrere Druckfunktionen zu verwenden. Die Verwendung von printf() zum Drucken eines einzelnen konstanten Zeichens ist ebenfalls übertrieben.

Verwandte Themen