2014-11-13 2 views
2

Я вижу вопрос в «языке программирования C», вот так: Напишите программу для копирования ее ввода на свой вывод, заменив каждую вкладку на \ t, каждое обратное пространство на \ b и каждую обратную косую черту на \. Это делает вкладки иКак я могу изменить backspace на ' b'?

обратные пространства видны недвусмысленным образом. тогда я пишу программу, как этот

#include<stdio.h> 
int main(void) 
{ 
    int c; 
    while((c=getchar())!=EOF) 
    { 
     if(c=='\t') 
     { 
      putchar('\\'); 
      putchar('t'); 
     } 
     if(c=='\b') 
     { 
      putchar('\\'); 
      putchar('b'); 
     } 
     if(c=='\\') 
     { 

      putchar('\\'); 
      putchar('\\'); 

     } 
     else{ 
      putchar(c); 

     } 


    } 
    return 0; 



} 

, но когда я входной забой, я не могу получить «\ Ь», так как я могу получить выход «\ Ь», то есть. Я имею в виду, как я могу выводить обратное пространство?

+0

что вы получите в качестве вывода? Правильно ли ведет вкладка? – smushi

+0

Я не думаю, что есть один простой ответ на этот вопрос. Это зависит от вашего терминала и т. Д. - это может быть буферизация всего, что вы набираете, а затем отправить его в свою программу, когда вы нажмете enter. Если это так, он может обрабатывать обратное пространство для вас, и ваша программа никогда их не увидит. – John3136

+0

Я считаю, что 'puts' может быть более эффективным, например' puts ("\\ t"); '. Он заменяет два вызова функций одним. –

ответ

0

Обратное пространство обычно съедается оболочкой. Используйте «crtl-h» для проверки обратного пространства.

Смотрите эту страницу для более подробно http://www.tldp.org/HOWTO/Keyboard-and-Console-HOWTO-5.html

+0

Это работает, только если ваша конфигурация вызывает клавишу Backspace для отправки символа DEL. –

4

Входной сигнал клавиатуры предобработан операционной системой. Большинство символов передаются непосредственно в качестве вклада в вашу программу, но некоторые из них обрабатываются специально.

В UNIX-подобных системах стандартный ввод обычно буферизируется по строке. Система считывает целую строку текста и не передает ее в вашу программу до тех пор, пока вы не нажмете . Введите. При чтении этой строки система обрабатывает Backspace сам; вместо добавления символа обратного пробела в буфер, он удаляет последний символ. Ваша программа никогда не видит персонажа '\b'.

Чтобы ввести буквальный символ в обратном пространстве, который может видеть ваша программа, в UNIX-подобной системе вы можете предшествовать ей с помощью Ctrl-V. И в зависимости от настроек вашего tty и терминального эмулятора, ввод ключа Backspace может передавать символ ASCII DEL, а не обратно. Чтобы убедиться, что ваша программа видит символ обратного пробела, введите Ctrl-VCtrl-H.

В системах, не относящихся к UNIX (скорее всего, Windows), возможно, есть способ сделать что-то подобное, но я не знаю, что это такое.

Вы также можете запустить свою программу с помощью ввода из файла. Получение символа обратного пробела во входном файле остается как упражнение (это зависит от работы вашего текстового редактора).

+0

Хороший ответ, и вы можете использовать 'getch()' для обнаружения каждого нажатия клавиши –

+0

@Ludovic: Есть как минимум две функции, называемые 'getch'. Один из них относится к Windows; другой является частью [n] проклятий. –

+0

Не знал этого, спасибо! я постараюсь улучшить свой ответ –

1

Функция getchar выполняет буферизацию ввода пользователя и отправляет его в вашу программу только при нажатии пользователем. Как предположил вы должны использовать getch() для выявления каждого нажатия клавиши

Ваш код должен быть:

#include<stdio.h> 
#include<conio.h> 
int main(void) 
{ 
    int c; 
    while ((c = getch()) != EOF) 
    { 
     if (c == '\t') 
     { 
      putchar('\\'); 
      putchar('t'); 
     } 
     else if (c == '\b') 
     { 
      putchar('\\'); 
      putchar('b'); 
     } 
     else if (c == '\\') 
     { 
      putchar('\\'); 
      putchar('\\'); 
     } 
     else if (c == '\r') 
     { 
      putchar('\n'); 
     } 
     else{ 
      putchar(c); 
     } 
    } 
    return 0; 
} 

Enter определяется как \r по Геч поэтому вы должны вручную заменить его \n, если вы хотите, чтобы перейти к следующему line

0

В вашем коде у вас есть три if s с остальными в конце ... так что ваш else привязан только к последним if. Для вкладок и backspace, поскольку они не являются обратным слэшем, последний if тест является ложным, а блок else выполняет печать исходного символа. Это означает, что после печати «\ t» вы печатаете вкладку (и, вероятно, видите пустое место в своем выходе), а после печати «\ b» вы печатаете обратное пространство, которое ест «b» или заставляет его перезаписываться следующим персонаж.Чтобы это исправить, либо использовать:

if(c == '\t') 
    { 
     putchar('\\'); 
     putchar('t'); 
    } 
    else if(c=='\b') /* "else if" rather than "if" */ 
    { 
     putchar('\\'); 
     putchar('b'); 
    } 
    else if(c=='\\') 
    { 
     putchar('\\'); 
     putchar('\\'); 
    } 
    else{ 
     putchar(c); 
    } 

... или просто переписать его с помощью переключателя:

switch(c) 
    { 
     case '\t': 
      puts("\\t"); 
      break; 
     case '\b': 
      puts("\\b"); 
      break; 
     case '\\': 
      puts("\\\\"); 
      break; 
     default: 
      putchar(c); 
    } 
Смежные вопросы