232 _______ __ ___ Часть II. Программирование на C++

h02321.jpg

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 первый