Проверить текст на соответствие числа открывающихся и закрывающихся скобок - 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
представляет собой позицию закрывающей скобки в строке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д