Упражнение 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()
{