Программа для проверки содержимого файла.Есть ли способ лучше? - PullRequest
2 голосов
/ 07 декабря 2011

Я создал очень простую программу отладки, которая проверяет, имеет ли исходный файл переменного тока одинаковое количество открывающих и закрывающих фигурных скобок, квадратных скобок и скобок.У меня есть довольно простой код, и он работает, но код кажется излишне длинным.Я подумывал об использовании массивов вместо этого.Массив для хранения каждого {, [, (и еще один для хранения},],), затем подсчитывает экземпляр каждого и сравнивает суммы.Но я думаю, что код будет почти таким же длинным.Что вы, ребята, думаете?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
FILE *fp;
char fname[20];
char c;
int curlybracket = 0;
int curlybracketr = 0;
int squarebracket = 0;
int squarebracketr = 0;
int parentheses = 0;
int parenthesesr = 0;

printf("Please enter the destination of the file: \n");
scanf("%s", fname);
fp = fopen(fname, "r");

if (fp == NULL)
    {
    printf("Problem opening file!\n");
    exit(0);
    }

else
    {
    printf("File opened correctly\n");
    }

    while (c != EOF)
    {
    c = getc(fp);
        if (c == '{')
            {
            curlybracket++;
            }

        if (c == '[')
            {
            squarebracket++;
            }

        if (c == '(')
            {
            parentheses++;
            }

        if (c == '}')
            {
            curlybracketr++;
            }

        if (c == ']')
            {
            squarebracketr++;
            }

        if (c == ')')
            {
            parenthesesr++;
            }
    }

    if (curlybracket == curlybracketr)
        {
        printf("There are an equal number of curlybrackets\n");
        }
        else
        {
        printf("There is an unequal number of curlybrackets\n");
        return 0;
        }

    if (squarebracket == squarebracketr)
        {
        printf("There are an equal number of squarebrackets\n");
        }
        else
        {
        printf("There are an unequal number of squarebrackets\n");
        }

    if (parentheses == parenthesesr)
        {
        printf("There are an equal number of parentheses\n");
        }
        else
        {
        printf("There are an unequal number of parentheses\n");
        }

return 0;
}

Ответы [ 4 ]

3 голосов
/ 07 декабря 2011

Ваша программа не сообщит об ошибке, если исходный файл похож на "([)]", что на самом деле недопустимо.

Лучшим решением является использование стека , который является структурой данных «первым пришел - первым вышел». Этот раздел со страницы википедии иллюстрирует использование.

Когда вы читаете открывающий символ из файла, поместите его в стек. Если это закрывающий символ, вытолкните стек. Если появившийся символ не соответствует открывающему символу, сообщите о несбалансированной ошибке.

В конце файла, если стек пуст, символы в файле сбалансированы.

Это самый распространенный из известных мне способов проверки сбалансированности символов.

2 голосов
/ 07 декабря 2011

Используйте оператор switch для списка сравнений с c.Если вы хотите, чтобы ваш код был еще более кратким, используйте единственный массив из 256 int значений, чтобы сохранить вхождение каждого символа и сравнить значения массива в { и }.

1 голос
/ 07 декабря 2011

Правда, программу можно переписать более коротким способом, используя массивы.Это может выглядеть примерно так:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
FILE *fp;
char fname[20];
char c;
char brackets[6] = "{}[]()";
int bracketCounts[6] = {0};
char * found;
int i;

printf("Please enter the destination of the file: \n");
scanf("%s", fname);

if ((fp = fopen(fname, "r")) == NULL){
    printf("Problem opening file!\n");
    return 0x00;
}

printf("File opened correctly\n");

// counting various parentheses
while ((c = getc(fp)) != EOF){
    found = strchr(brackets, c);
    if (found != NULL) {
        bracketCounts[found - brackets]++;
    }
}

// dont't forget to close file after reading is done
fclose(fp);

// checking parentheses counters
for (i=0; i < 6; i+=2) {
    if (bracketCounts[i] != bracketCounts[i+1]) {
        printf("Unbalanced parentheses !\n");
        return 0x00;
    }
}

printf("All parentheses are OK!\n");

return 0x00;
}

Но, как упоминалось @lbs, оно подвержено ошибкам, гораздо лучше использовать подход @lbs!

0 голосов
/ 07 декабря 2011

Количество появлений символов в строке

#include <algorithm>
std::string s = "a(b(c))";

int curlybracket = std::count(s.begin(), s.end(), '(') - std::count(s.begin(), s.end(), ')');
if(curlybracket == 0) /* coool */ else /* fail */

просто еще один способ решить проблему

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