Упражнение 3.3
. Напишите функцию expand(s1,s2), заменяющую сокращенную запись наподобие a-z в строке s1 эквивалентной полной записью аbс…хуz в s2. В s1 допускаются буквы (прописные и строчные) и цифры. Следует уметь справляться с такими случаями, как a-b-c, a-z0-9 и -a-b. Считайте знак - в начале или в конце s1 обычным символом минус.3.6 Цикл do-while
Как мы говорили в главе 1, в циклах while
и for проверка условия окончания цикла выполняется наверху. В Си имеется еще один вид цикла, do-while, в котором эта проверка в отличие от while и for делается внизу после каждого прохождения тела цикла, т. е. после того, как тело выполнится хотя бы один раз. Цикл do-while имеет следующий синтаксис:do
while (
Сначала выполняется
Опыт показывает, что цикл do-while
используется гораздо реже, чем while и for. Тем не менее потребность в нем время от времени возникает, как, например, в функции/* itoa: преобразование n в строку s */
void itoa(int n, char s[])
{
int i, sign;
if ((sign = n) ‹ 0) /* сохраняем знак */
n =-n; /* делаем n положительным */
i = 0;
do {/* генерируем цифры в обратном порядке */
s[i++] = n %10 + '0'; /* следующая цифра */
} while ((n /= 10) › 0); /* исключить ее */
if (sign ‹ 0)
s[i++] = '-';
s[i] = '\0';
reverse(s);
}
Конструкция do-while
здесь необходима или по крайней мере удобна, поскольку в s посылается хотя бы один символ, даже если n равно нулю. В теле цикла одну инструкцию мы выделили фигурными скобками (хотя они и избыточны), чтобы неискушенный читатель не принял по ошибке слово while за начало цикла while.Упражнение 3.4
. При условии, что для представления чисел используется дополнительный код, наша версияУпражнение 3.5
. Напишите функцию itob(n,s,b), которая переводит целое n в строку s, представляющую число по основанию b. В частности, itob(n, s, 16) помещает в s текст числа n в шестнадцатеричном виде.Упражнение 3.6
. Напишите версию itoa с дополнительным третьим аргументом, задающим минимальную ширину поля. При необходимости преобразованное число должно слева дополняться пробелами.3.7 Инструкции break и continue
Иногда бывает удобно выйти из цикла не по результату проверки, осуществляемой в начале или в конце цикла, а каким-то другим способом. Такую возможность для циклов for
, while и do-while, а также для переключателя switch предоставляет инструкция break. Эта инструкция вызывает немедленный выход из самого внутреннего из объемлющих ее циклов или переключателей.Следующая функция,
/* trim: удаляет завершающие пробелы, табуляции и новые строки */
int trim(char s[])
{
int n;
for (n = strlen(s)-1; n ›= 0, n--)
if (s[n]!= ' '&& s[n]!= '\t'&& s[n]!= '\n')
break;
s[n+1] = '\0';
return n;
}