Напишите программу detab, заменяющую символы табуляции во вводимом тексте нужным числом пробелов - C (СИ)
Формулировка задачи:
Упражнение 1.20.
Перевод: Напишите программу detab, заменяющую символы табуляции во вводимом тексте нужным числом пробелов (до следующего "стопа" табуляции). Предполагается, что "стопы" табуляции расставлены на фиксированном расстоянии друг от друга, скажем, через n позиций. Как лучше задавать n - в виде значения переменной или в виде именованной константы?
Оригинал: Write a program detab that replaces tabs in the input with the proper number of blanks to space to the next tab stop. Assume a fixed set of tab stops, say every n columns. Should n be a variable or a symbolic parameter?
Обьясните, пожалуйста, условие задачи простым языком, если можно с картинками. Что есть "стоп" табуляции?
Решение задачи: «Напишите программу detab, заменяющую символы табуляции во вводимом тексте нужным числом пробелов»
textual
Листинг программы
#include <stdio.h> //библиотека ввода-вывода
#include <cstdlib> //библиотека задержки экрана (system)
#include <iostream>
#include <cstdio>
#include <conio.h>
#define TAB 8
int main()
{
setlocale(LC_ALL, "rus"); //Ввод/вывод русских символов
int c, i,j, n,m;
char massiv[TAB];
for (i = 0; i < TAB; i++)
massiv[i] = '0'; //ОБНУЛЕНИЕ МАССИВА
n = 0, m=0;
while (((c=getchar())!=EOF) && (c!='\n'))
{
n++;
if (massiv[TAB - 1] != '0') //ЕСЛИ МАССИВ ЗАПОЛНЕН, ВЫВОДИМ И ОБНУЛЯЕМ
{
printf("%s", massiv);
m = 0;
for (i = 0; i < TAB; i++)
massiv[i] = '0';
}
if (c != '\t' && m >= 0) //ЕСЛИ СИМВОЛ НЕ 'TAB'
{
m++;
massiv[m-1] = c;
}
else if (m > 0) //ЕСЛИ СИМВОЛ 'TAB'
for (i = m; i < TAB; i++)
massiv[i] = '|';
}
for (i = 0; i < TAB && massiv[i]!='0'; i++) //ВЫВОД СИМВОЛОВ ОКОНЧАНИЯ МАССИВА
printf("%c", massiv[i]);
printf("\n");
system("PAUSE");
return 0;
}
Объяснение кода листинга программы
- Включаются необходимые библиотеки для работы с вводом-выводом, задержкой экрана и символами русских языков.
- Определяется константа TAB, равная 8.
- Устанавливается локальная настройка вывода русских символов.
- Объявляются необходимые переменные: c - для хранения вводимого символа; i, j - для работы с массивом; n - для подсчета количества введенных символов; m - для подсчета количества пробелов, которые нужно добавить.
- Создается массив massiv размером TAB, заполненный символами '0'.
- В цикле while считываются символы из стандартного ввода до конца строки или до символа новой строки.
- Если массив massiv заполнен (массив заполняется при каждой новой табуляции), выводится его содержимое, обнуляется счетчик m и символы табуляции заменяются на символы '|'.
- Если считанный символ не является табуляцией и счетчик m больше 0, увеличивается значение счетчика m и в массив massiv записывается считанный символ.
- Если считанный символ является табуляцией и счетчик m больше 0, все символы в массиве massiv, начиная с позиции m, заменяются на символы '|'.
- После окончания ввода выводится содержимое массива massiv.
- Вызывается функция system(
PAUSE) для приостановки работы программы до нажатия клавиши. - Возвращается 0, что означает успешное завершение работы программы.