2016-11-02 3 views
0

Я пытаюсь написать короткую программу, которая помещает каждое слово в новую строку. Новая строка может быть подтверждена табулятором, пробелом или enter. Конец программы помещает «#» в консоль. У меня возникла проблема, что когда я помещаю «вводить» в консоль, он записывает следующие символы в одной строке.Почему printf (" n") не переходит к следующей строке?

Вторая идея состоит в том, чтобы сделать все это в таблице, поэтому я могу скомпоновать форматированный текст в конце. Я тоже не могу понять.

#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

Вы проверили, что возвращается '_getch()', когда вы предоставляете «enter»? – Martin

+2

В Windows вы выдаете «\ r \ n» для новой строки. –

+0

@JohnnyMopp Стандарт C требует 'printf (" \ n ")' для DTRT, независимо от того, является ли терминатор линии OS единственным символом. (В частности, как вход, так и вывод в объектах FILE, открытых в текстовом режиме, требуется для преобразования между '\ n' и любым терминатором линии ОС.' '_getch' не является частью стандарта C, поэтому он не подлежит этому править. – zwol

ответ

3

Поскольку удары «ввести» выдает возврат каретки (символ \r), а не одну новую строку.

Я заметил это, когда курсор отскочил назад в начале строки, когда я нажал кнопку «Ввод».

Fix ваш код, как это (Факторизует case заявления тоже):

#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

Вы, вероятно, получить возврат каретки ('\r'), которая является то, что Return обычно генерирует.

Так что вам нужно также проверить это. Ваш код может быть упрощена:

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

Поскольку мы всегда выдавались ровно один символ итерации, нет необходимости использовать несколько функций печати. Кроме того, использование printf() для печати одного символа постоянной является излишним.

 Смежные вопросы

  • Нет связанных вопросов^_^