232 _______ __ ___ Часть II. Программирование на C++
include <iostream.h>
void main() {
const unsigned MAX_STR_LEN = 25;
char s[MAX_STR_LEN] ;
cout « "\пВведите несколько строк (окончание по <Ctrl+C>).\n";
// getline вводит в s максимум MAX_STR_LEN-1 за один раз. Поэтому
// опасности ввести лишнего нет.
while (cin.getline(s, MAX_STR_LEN-1)) {
// Считаем общее число символов в s, без учета // _завершающего нуля. char *sp = s;
int count = 0;
while (*sp++) ++count;
cout « "Во введенной строке " « count « " символов.\n";
// Копируем символы, отличные от пробелов, табуляций и т. п. эр = s;
count = О;
char *sp2 = s;
while (*sp) {
if ((*sp != ' ') && (*sp != '\t') && (*sp != '\n')) sp2[count++] = *sp;
*sp++;
} sp2[count] = '\0';
cout « "Входная строка без пробелов: " « s « endl;
) }
Несколько слов по поводу программы из листинга 10.5. Во-первых, может ли внешний цикл while длиться бесконечно? Не может. Пользователь в любой момент может прервать выполнение программы, нажав <Ctrl>+<C> или <Ctri>+<Break>. Может ли getline () считать больше чем MAX_STR_LEN-I и тем самым создать проблемы внутреннему циклу while? Опять-таки, не может: getline () копирует вводимые символы в s до тех пор, пока не будут скопированы MAX_STR_LEN-I символов или до новой строки. Затем getline о записывает в s завершающий строку нуль. Таким образом, оба внутренних цикла while обязательно закончатся.
Почему бы не увеличивать указатель во втором внутреннем цикле while так же, как и в первом? Хотя операция инкремента указателя является постфиксной, само выражение полностью вычисляется до выполнения тела самого цикла. При наращивании указателя внутри выражения while первый