Проверить текст на соответствие числа открывающихся и закрывающихся скобок - C (СИ)
Формулировка задачи:
Дан текстовый файл, содержащий программу на языке Си.
Проверить эту программу на соответствие числа открывающихся и
закрывающихся скобок (круглых, квадратных, фигурных и
угловых).
Как можно прочитать файл, чтобы была возможность проверять является ли текущий символ скобкой или нет?
Пишу через построчное чтение, но не уверен, что пишу правильно и подходит ли этот способ вообще, помогите
p=fgets(s,80,f);
if(p==NULL)
printf("Файл закончился");
else
printf("Прочитана строка:\n%s",s);Решение задачи: «Проверить текст на соответствие числа открывающихся и закрывающихся скобок»
textual
Листинг программы
#include <stdio.h>
size_t bracket_pos( const char *, char );
int main()
{
size_t position = bracket_pos( "Hey, ( in brackets ) ( ... ((((", '(' );
printf( "%d", (long)position );
}
size_t bracket_pos_( const char* str, char bt_o, char bt_c )
{
size_t pos = 0; /* current symbol of str */
size_t last_opened_pos;
size_t opened = 0, closed = 0;
/* ---- ---- */
do
{
if ( *str == bt_c ) closed += 1;
if ( *str == bt_o )
{
if ( opened == closed ) last_opened_pos = pos;
opened += 1;
}
if ( closed > opened ) return pos;
pos += 1;
}
while ( *++str );
if ( opened == closed ) return (size_t)-2; /* ???? */
return last_opened_pos;
}
size_t bracket_pos( const char* str, char bracket )
{
if ( !str ) return (size_t)-1;
if ( !*str ) return (size_t)-1;
/* ---- ---- */
char bracket_opened, bracket_closed;
switch ( bracket )
{
case '(':
case ')': bracket_opened = '('; bracket_closed = ')'; break;
case '<':
case '>': bracket_opened = '<'; bracket_closed = '>'; break;
case '[':
case ']': bracket_opened = '['; bracket_closed = ']'; break;
case '{':
case '}': bracket_opened = '{'; bracket_closed = '}'; break;
default: return (size_t)-1;
}
return bracket_pos_( str, bracket_opened, bracket_closed );
}
Объяснение кода листинга программы
- В функции
bracket_posпроверяется, является ли входной строка пустой. Если это так, функция возвращает-1. - В функции
bracket_posсоздаются две переменныеbracket_openedиbracket_closed, которые будут использоваться для отслеживания открытых и закрытых скобок соответственно. - В функции
bracket_posиспользуется операторswitchдля определения типа скобки, которую нужно отследить. - В функции
bracket_posвызывается функцияbracket_pos_, передавая ей входную строку, открывающую скобку и закрывающую скобку. - В функции
bracket_pos_инициализируются переменныеpos,last_opened_pos,openedиclosedсо значениями 0. - В функции
bracket_pos_используется циклdo, чтобы пройти через каждый символ входной строки. - В функции
bracket_pos_проверяется, является ли текущий символ закрывающей скобкой. Если это так, увеличивается значениеclosed. - В функции
bracket_pos_проверяется, является ли текущий символ открывающей скобкой. Если это так, увеличивается значениеopened, и еслиopenedравноclosed, то обновляется значениеlast_opened_pos. - В функции
bracket_pos_используется операторif, чтобы проверить, превышает ли количество закрывающих скобок количество открывающих скобок. Если это так, функция возвращает позицию открывающей скобки. - В функции
bracket_pos_используется операторif, чтобы проверить, равны ли количество открывающих и закрывающих скобок. Если это так, функция возвращает-2. - В функции
bracket_pos_возвращается значениеlast_opened_pos, если количество открывающих и закрывающих скобок равно. - В функции
mainвызывается функцияbracket_pos, передавая ей строкуHey, ( in brackets ) ( ... ((((и символ ')'. - В функции
mainвыводится значениеposition. - Значение
positionпредставляет собой позицию закрывающей скобки в строке.