#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define DIGITS 2
void error(const char* const msg);
char* getLine();
bool isValidLine(const char* line);
/*
*
*/
int main()
{
char* line = 0;
// Читаем построчно
while (line = getLine())
{
// Если строка удовлетворяет условию
if (isValidLine(line))
{
printf("%s", line);
}
// Освободим память
free(line);
}
return EXIT_SUCCESS;
}
// Выводит сообщение об ошибке
void error(const char* const msg)
{
fprintf(stderr, "%s\n", msg);
exit(EXIT_FAILURE);
}
// Читает строку
char* getLine()
{
// Буфер
char buffer[BUFSIZ];
char* result = 0, *tmp = 0;
size_t size = 0;
while (true)
{
// Читаем
if (!fgets(buffer, sizeof (buffer), stdin))
{
// Если конец файла
if (feof(stdin))
{
return result;
}
else
{
error("Ошибка ввода/вывода");
}
}
// Добавим к длине строки
size += strlen(buffer);
// Попытка выделить память
if (!(tmp = realloc(result, size + 1)))
{
error("Не могу выделить память");
}
// Копируем из буфера
if (!result)
{
strcpy(tmp, buffer);
}
else
{
// Присоединяем, если не первый раз
strcat(tmp, buffer);
}
result = tmp;
// Если прочли до конца строки, то выход
if (size && result[size - 1] == '\n')
{
return result;
}
}
}
// Проверка строки на соответствие условию
bool isValidLine(const char* line)
{
if (!line)
{
return false;
}
size_t cnt = 0;
// Идем посимвольно
while (*line)
{
// Если цифра
if (isdigit(*line++))
{
// Увеличим счетчик
++cnt;
}
else
{
// Если не цифра и к-во цифр совпало с условием
if (cnt == DIGITS)
{
break;
}
// Иначе обнулим счетчик
cnt = 0;
}
}
return cnt != DIGITS;
}
> cat ./test.txt
valid string
not valid string 12
123456
11
> ./181219 < test.txt
valid string
123456
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.