Упражнение 1.22. Напишите программу, печатающую символы входного потока так, чтобы строки текста не выходили правее n-й позиции. Это значит, что каждая строка, длина которой превышает n, должна печататься с переносом на следующие строки. Место переноса следует “искать” после последнего символа, отличного от символа-разделителя, расположенного левее n-й позиции. Позаботьтесь о том, чтобы ваша программа вела себя разумно в случае очень длинных строк, а также когда до n-й позиции не встречается ни одного символа пробела или табуляции.
Упражнение 1.23. Напишите программу, убирающую все комментарии из любой Си-программы. Не забудьте должным образом обработать строки символов и строковые константы. Комментарии в Си не могут быть вложены друг в друга.
Упражнение 1.24. Напишите программу, проверяющую Си-программы на элементарные синтаксические ошибки вроде несбалансированности скобок всех видов. Не забудьте о кавычках (одиночных и двойных), эскейп-последовательностях (\...) и комментариях. (Это сложная программа, если писать ее для общего случая.)
#include <stdio.h>
#define BUFSIZE 1000 /* максимальный размер буфера ввода */
int getbuffer(char line[], int maxline);
void checker(char code[]);
int main()
{
int len; /* размер содержимого буфера */
char buffer[BUFSIZE]; /* буфер ввода */
len = 0;
while ((len = getbuffer(buffer, BUFSIZE)) > 0) {
//printf("%s\n", buffer);
checker(buffer);
}
return 0;
}
/* checker: проверка парности скобок в s, возвращает сообщения об ошибках */
void checker(char code[])
{
int i, c;
int nb;
i = nb = 0;
while ((c = code[i]) != '\0') {
if (c == '(')
++nb;
if (c == ')') {
--nb;
if (nb < 0)
break; // выражение открывается с закрывающей
} // скобки - выходим
++i;
}
if (nb > 0)
printf("Незакрытых ')': %d", nb);
else if (nb < 0)
printf("Незакрытых '(': %d", -nb);
}