LINUX.ORG.RU

[К&Р: Язык Си] Задачки


0

1

Привет.

Задача (выдержка):
1.10 Write a program to copy its input to its ouput, replacing each ... backspace by \b ...

Инструментарий:
getchar, putchar, for, if, else, while - другого в предшествующем задаче материале - не было.

Вопрос:
Как? Ввод-то - буферизованный, backspace прочитать не получится.


Спасибо.

создай файл, который содержит символы backspace и подай на вход программы cat'ом

Reset ★★★★★
()
Ответ на: комментарий от anonymous

Подсказать. Ввод буферизованный, ждет, пока я не нажму enter.
И как мне прочитать backspace?

Frakhtan-teh ★★
() автор топика
tcgetattr(STDIN_FILENO, &a);
a.c_lflag &= ~ICANON;
tcsetattr(STDIN_FILENO, TCSANOW, &a);
anon_666
()

Это дзен.

anonymous
()

Как? Ввод-то - буферизованный, backspace прочитать не получится.

Если вам нужно проверить правильность работы программы, можно сделать так:

#include <stdio.h>

int main(void) {
	int c;
	while((c = getchar()) != EOF) {
		if(c == '\b') {
			printf("\\b");
		} else {
			putchar(c);
		}
	}
	return 0;
}
$ gcc test.c -o test
$ echo -e "1\b123"
123
$ echo -e "1\b123" | ./test
1\b123

edigaryev ★★★★★
()
Ответ на: комментарий от Frakhtan-teh

Никогда не понимал, зачем люди задают такие вопросы. Какая разница, есть там \b или нет - главное чтобы программа работала как надо, суть данной задачи то не в \b.

anonymous
()
Ответ на: комментарий от Frakhtan-teh

>Чтобы понять, работает ли программа как надо. Же.

А разве это и так не ясно? Программа простая - если она не ошибается на всём, то и на \b не ошибётся. Тем более видно почему \b не работает - из-за буферизации.

anonymous
()

заодно уж можно разобраться с генерацией кода и внутренностями C и архитектуры

#include <stdio.h>
int main() {
  while(1) {
    switch(getchar()) {
      case EOF  : return 0;
      case '\\' : putchar('\\');putchar('b');break;
      default : 	asm("push %bp;pushw %ax;call _putchar");
    }
  }
  return 0;
}
MKuznetsov ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.