Упражнение 1.9. Напишите программу, копирующую символы ввода в выходной поток и заменяющую стоящие подряд пробелы на один пробел.
Упражнение 1.10. Напишите программу, копирующую вводимые символы в выходной поток с заменой символа табуляции на \t, символа забоя на \b и каждой обратной наклонной черты на \\. Это сделает видимыми все символы табуляции и забоя.
1.5.4 Подсчет слов
Четвертая из нашей серии полезных программ подсчитывает строки, слова и символы, причем под словом здесь имеется в виду любая строка символов, не содержащая в себе пробелов, табуляций и символов новой строки. Эта программа является упрощенной версией программы wc системы UNIX.
#include ‹stdio.h›
#define IN 1 /* внутри слова */
#define OUT 0 /* вне слова */
/* подсчет строк, слов и символов */
main()
{
int с, nl, nw, nc, state;
state = OUT;
nl = nw = nc = 0;
while ((с = getchar()) != EOF) {
++nc;
if (c == '\n')
++nl;
if (c == ' ' || c == '\n' || c == '\t')
state = OUT;
else if (state == OUT) {
state = IN;
++nw;
}
}
printf("%d %d %d\n", nl, nw, nc);
}
Каждый раз, встречая первый символ слова, программа изменяет значение счетчика слов на 1. Переменная
Строка
nl = nw = nc = 0;
устанавливает все три переменные в нуль. Такая запись не является какой-то особой конструкцией и допустима потому, что присваивание есть выражение со своим собственным значением, а операции присваивания выполняются справа налево. Указанная строка эквивалентна
nl = (nw = (nc = 0));
Оператор || означает ИЛИ, так что строка
if (c == ' ' || c == '\n' || c == '\t')
читается как "если c есть пробел,
В примере также встречается слово else, которое указывает на альтернативные действия, выполняемые в случае, когда условие, указанное в if, не является истинным. В общем виде условная инструкция записывается так:
if (
else
В конструкции if-else выполняется одна и только одна из двух инструкций. Если
Упражнение 1.11. Как протестировать программу подсчета слов? Какой ввод вероятнее всего обнаружит ошибки, если они были допущены?
Упражнение 1.12. Напишите программу, которая печатает содержимое своего ввода, помещая по одному слову на каждой строке.
1.6 Массивы
А теперь напишем программу, подсчитывающую по отдельности каждую цифру, символы-разделители (
#include ‹stdio.h›
/* подсчет цифр, символов-разделителей и прочих символов */
main()
{