Programms from Kernighan and Ritchie

Pages: 1234
Упражнение 1.22. Напишите программу, печатающую символы входного потока так, чтобы строки текста не выходили правее n-й позиции. Это значит, что каждая строка, длина которой превышает n, должна печататься с переносом на следующие строки. Место переноса следует “искать” после последнего символа, отличного от символа-разделителя, расположенного левее n-й позиции. Позаботьтесь о том, чтобы ваша программа вела себя разумно в случае очень длинных строк, а также когда до n-й позиции не встречается ни одного символа пробела или табуляции.

#include <stdio.h>

#define MAXLINE 20 /* максимальный размер вводимой строки + 1 */

int getl(char line[], int maxline);

int main()
{
int len; /* длина текущей строки */
char line[MAXLINE]; /* текущая строка */

len = 0;
while ((len = getl(line, MAXLINE)) > 0) {
printf("%s\n", line);
}
return 0;
}

/* getline: читает строку в s, возвращает длину */
int getl(char s[], int lim)
{
int c, i;

for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i)
s[i] = c;
if (i == lim-2) {
s[i] = '\n';
++i;
}
s[i] = '\0';
return i;
}
Упражнение 1.23. Напишите программу, убирающую все комментарии из любой Си-программы. Не забудьте должным образом обработать строки символов и строковые константы. Комментарии в Си не могут быть вложены друг в друга.

#include <stdio.h>

#define BUFSIZE 10000 /* максимальный размер буфера ввода + 1 */

int getbuffer(char line[], int maxline);
void decomment(char to[], char from[])
{
int i, j, c;
int cf, qf;

i = j = 0;
cf = qf = 0;
while ((c = from[i]) != '\0') {
if (c == '"') {
if (qf == 0)
qf = 1;
else
qf = 0;
to[j] = from[i];
++j;
}
else if (c == '/' && from[i+1] == '*' && cf == 0 && qf == 0) {
cf = 1;
++i;
}
else if (c == '*' && from[i+1] == '/' && cf == 1 && qf == 0) {
cf = 0;
++i;
}
else if (cf == 0) {
to[j] = from[i];
++j;
}
++i;
}
}
Упражнение 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);
}
этот форум ест для вопросов о програмированние в среде windows. и не думаю што много людей поимут что вы здесь написали

лучшее место для програмного кодо ыло бы http://www.cplusplus.com/articles/sourcecode/
null я понять не могу ты из нашей группы или вообще отдельный человек?)
Topic archived. No new replies allowed.
Pages: 1234