Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 13

Проверка скобок и кавычек в тексте на Си

04.06.2013, 22:29. Показов 3967. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Задание: нужно проверить есть ли пара у кавычек, скобок, квадратных скобок.
Я тут кое-чего написал:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <stdio.h>
#include <stdlib.h>
 
void get_string(char to[], unsigned int max_s, FILE *stream)
{
        int i, symbol;
 
        for (i = 0; i < max_s - 1 && (symbol = (getc(stream))) != EOF && symbol
                                                                  != '\n'; ++i)
                to[i] = symbol;
        to[i] = '\0';
}
 
 
int main(void)
{
#define MAX_FILENAM_LENGHT 100
 
        FILE *file_to_check;
        char filename[MAX_FILENAM_LENGHT];
        int symbol;
        int braces = 0, quotes = 0, square_brackets = 0;
        unsigned int mistakes = 0;
 
        puts("Please, enter file to check>");
        get_string(filename, MAX_FILENAM_LENGHT, stdin);
 
        if ((file_to_check = fopen(filename, "r")) == NULL) {
                perror("ERROR");
                return EXIT_FAILURE;
        }
 
        while ((symbol = getc(file_to_check)) != EOF)
                if (symbol == '{')
                        ++braces;
                else if (symbol == '}')
                        --braces;
                else if (symbol == '[')
                        ++square_brackets;
                else if (symbol == ']')
                        --square_brackets;
                else if (symbol == '\"')
                        ++quotes;
 
        if (braces < 0)
                braces = braces - (braces * 2);
        if (square_brackets < 0)
                square_brackets = square_brackets - (square_brackets * 2);
 
        mistakes = braces + square_brackets;
 
        if ((quotes % 2) != 0)
                ++mistakes;
 
        if (mistakes)
                printf("Have mistakes: %d", mistakes);
        else
                puts("Mistakes don't found!");
 
        return EXIT_SUCCESS;
}
Вроде работает. Вопросы вообще-то по стилю программирования: Получиться лучше читаемо, если юзать вместо констант EXIT_FAILURE и EXIT_SUCCES числа 0 и 1(такой же вопрос и про другие константы)? Имена переменных лучше такими длинными не делать? Я не переборщил с пустыми строками, их вообще часто нужно ставить? Может что еще не правильно?

Добавлено через 10 минут
Можете еще какие-нибудь рекомендации по стилю дать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.06.2013, 22:29
Ответы с готовыми решениями:

Проверка правильности расстановки скобок в тексте
Дана строка, содержащая латинские буквы и круглые скобки. Если скобки расставлены правильно (то есть каждой открывающей соответствует одна...

Внести произвольный текст. Проверить в заданном тексте количество открытых скобок равно числу закрытых скобок
Внести произвольный текст. Проверить в заданном тексте количество открытых скобок равно числу закрытых скобок.

Ввести произвольный текст. Проверить, в заданном тексте количество открытых скобок равно количеству закрытых скобок.
Помогите сделать задачу: Ввести произвольный текст. Проверить, в заданном тексте количество открытых скобок равно количеству закрытых...

4
...
 Аватар для anmartex
1910 / 1329 / 966
Регистрация: 12.02.2013
Сообщений: 2,172
05.06.2013, 04:57
Цитата Сообщение от jeart! Посмотреть сообщение
Получиться лучше читаемо, если юзать вместо констант EXIT_FAILURE и EXIT_SUCCES числа 0 и 1(такой же вопрос и про другие константы)?
Макросы EXIT_FAILURE и EXIT_SUCCES, на сколько я помню, нужны для совместимости с не POSIX системами. Но лично по моему мнению они абсолютно читабельны не мешают.

Цитата Сообщение от jeart! Посмотреть сообщение
Имена переменных лучше такими длинными не делать?
Имена нужно делать такими, чтобы было понятно назначение переменной. Конечно слишком длинные или похожие имена труднее читаются и анализируются. В общем тут панацеи нет.

Цитата Сообщение от jeart! Посмотреть сообщение
Я не переборщил с пустыми строками, их вообще часто нужно ставить?
С вертикальными - нет, а с горизонтальными - однозначно. Размер табуляции обычно равен 3-ём или 4-ём. Меньше 3-ёх - уже всё сливается, а больше 4-ёх слишком всё растянуто, кроме этого, если у вас будет более 4 вложений, то вы рискуете получить МЕГА-лестницу не влезающую по ширине в экран.

Цитата Сообщение от jeart! Посмотреть сообщение
Можете еще какие-нибудь рекомендации по стилю дать?
В разных проектах стиль может быть свой, и это нормально. Просто из головы не нужно выпускать тот факт, что вы пишите код не для компьютера, а для человека.

Оформление кода
1
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 13
05.06.2013, 13:51  [ТС]
Цитата Сообщение от anmartex Посмотреть сообщение
Меньше 3-ёх - уже всё сливается, а больше 4-ёх слишком всё растянуто, кроме этого, если у вас будет более 4 вложений, то вы рискуете получить МЕГА-лестницу не влезающую по ширине в экран.
Хм...я руководствовался https://www.kernel.org/doc/Doc... odingStyle, так вот, там говориться что читабельнее будет делать отступ в 8, а если уровней отступов получиться больше 3-х -- программу пора исправлять...
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
05.06.2013, 16:05
Цитата Сообщение от jeart! Посмотреть сообщение
Вроде работает.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <stdio.h>
#include <stdlib.h>
 
void get_string(char to[], unsigned int max_s, FILE *stream)
{
        int i, symbol;
 
        for (i = 0; i < max_s - 1 && (symbol = (getc(stream))) != EOF && symbol
                                                                  != '\n'; ++i)
                to[i] = symbol;
        to[i] = '\0';
}
 
 
int main(void)
{
#define MAX_FILENAM_LENGHT 100
        
        /* 
        FILE *file_to_check;
        char filename[MAX_FILENAM_LENGHT];
 
 
        puts("Please, enter file to check>");
        get_string(filename, MAX_FILENAM_LENGHT, stdin);
 
        if ((file_to_check = fopen(filename, "r")) == NULL) {
                perror("ERROR");
                return EXIT_FAILURE;
        }
 
        while ((symbol = getc(file_to_check)) != EOF)
        */
        
        int symbol;
        int braces = 0, quotes = 0, square_brackets = 0;
        unsigned int mistakes = 0;
        
        char test[] = "This \"string [ is ( probably\" wrong] catch it)?", *p;
        
        for ( p = test; *p; ++p ) {
                symbol = *p; /* чтобы много не переделывать */
                
                if (symbol == '{')
                        ++braces;
                else if (symbol == '}')
                        --braces;
                else if (symbol == '[')
                        ++square_brackets;
                else if (symbol == ']')
                        --square_brackets;
                else if (symbol == '\"')
                        ++quotes;
        }
 
        if (braces < 0)
                braces = braces - (braces * 2);
        if (square_brackets < 0)
                square_brackets = square_brackets - (square_brackets * 2);
 
        mistakes = braces + square_brackets;
 
        if ((quotes % 2) != 0)
                ++mistakes;
 
        if (mistakes)
                printf("Have mistakes: %d", mistakes);
        else
                puts("Mistakes don't found!");
 
        return EXIT_SUCCESS;
}
Code
1
2
3
[andrew@andrew strings]$ gcc -o jeart_wrong_check jeart_wrong_check.c 
[andrew@andrew strings]$ ./jeart_wrong_check 
Mistakes don't found!
Классический вариант - использовать стек для проверки парности и вложенности скобок/кавычек/etc...

По стилю в целом с anmartex согласен.
2
...
 Аватар для anmartex
1910 / 1329 / 966
Регистрация: 12.02.2013
Сообщений: 2,172
05.06.2013, 16:36
Цитата Сообщение от jeart! Посмотреть сообщение
Хм...я руководствовался https://www.kernel.org/doc/Doc... odingStyle, так вот, там говориться что читабельнее будет делать отступ в 8, а если уровней отступов получиться больше 3-х -- программу пора исправлять...
Ну значит мы с вами в разных "сектах". Поверьте, не всегда можно удерживать лимит по 3-ём вхождениям.

Цитата Сообщение от anmartex Посмотреть сообщение
В разных проектах стиль может быть свой, и это нормально. Просто из головы не нужно выпускать тот факт, что вы пишите код не для компьютера, а для человека.
Если вам это так важно, скачайте парочку более-менее серьёзных проектов да посмотрите какой стиль используют в них.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.06.2013, 16:36
Помогаю со студенческими работами здесь

Вывод чисел из массива в строку без кавычек и квадратных скобок
python 3.6 a=input().split() piska= for s in range (1,len(a)+1): if s%2==0: piska.append(s) Это мой...

Нужен совет по увеличению размера кавычек в тексте
Добрый день, не получается увеличить кавычки так, чтобы не затрагивало отступы верхнего и нижнего текста, да и собственно уползают вверх...

Заменить в тексте символы кавычек (") на соответствующие парные («»)
Помогите составить регулярное выражение для следующей функции: Задача. Заменить в тексте символы кавычек (&quot;) на соответствующие...

Поиск в тексте неодинаковых открытой и закрытой дужек или кавычек
разработать программу по поиску в тексте неодинаковых открытой и закрытой дужек или кавычек. Исправить ошибки и сохранить файл

Как удалить используя рег. выражения символы пробелов и кавычек в тексте?
допустим дан текст: &amp;quot;The some&amp;nsbp; нужно только текст оставить


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru