2016-12-12 7 views
1

Я пытаюсь написать программу, которая сканирует текстовый файл и подсчитывает количество открытых и закрытых скобок для сравнения. Однако до сих пор ive удалось вычислить первое появление скобки в строке.Подсчет количества скобок в файле

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

int main() 
{ 
    FILE *fileName; 
    fileName = fopen("/home/vagrant/Desktop/tests/t5", "r"); 

    if (fileName != NULL) 
    { 
    int noOfOpenPar=0; 
    int noOfClosePar=0; 
    int noOfOpenSqr=0; 
    int noOfCloseSqr=0; 
    int noOfOpenCurl=0; 
    int noOfCloseCurl=0; 
    char lineOfText[80]; 

    while (fgets(lineOfText, 80, fileName) != NULL) 
    { 
     if (strstr(lineOfText, "(") != NULL) 
     noOfOpenPar++; 
     if (strstr(lineOfText, ")") != NULL) 
     noOfClosePar++; 
     if (strstr(lineOfText, "[") != NULL) 
     noOfOpenSqr++; 
     if (strstr(lineOfText, "]") != NULL) 
     noOfCloseSqr++; 
     if (strstr(lineOfText, "{") != NULL) 
     noOfOpenCurl++; 
     if (strstr(lineOfText, "}") != NULL) 
     noOfCloseCurl++; 
    } 
    printf ("\nThe number of open parenthesies is %d and closed parenthesies  %d\n", noOfOpenPar, noOfClosePar); 
    if (noOfOpenPar!=noOfClosePar) 
    printf("Number of open and closed parenthesies doesn't match\n"); 
    printf ("\nThe number of open square brackets is %d and closed square brackets is %d\n", noOfOpenSqr, noOfCloseSqr); 
    if (noOfOpenSqr!=noOfCloseSqr) 
    printf("Number of open and closed square brackets doesn't match\n"); 
    printf ("\nThe number of open curly brackets is %d and closed curly brackets is %d\n", noOfOpenCurl, noOfCloseCurl); 
    if (noOfOpenCurl!=noOfCloseCurl) 
    printf("Number of open and closed curly brackets doesn't match\n"); 

    } 

} 
+2

Вам нужно больше петель. Или прочитать символ файла по символу. –

+0

Вы не знаете, совпадает ли он с подсчетом. Например, ') (', '([)]' и т. Д. – BLUEPIXY

ответ

3

Вы не можете использовать strstr() для этого, то лучше просто перебрать все символы и проверять их. В конце концов, вы ищете маркеры с 1 символом.

Что-то вроде этого, а не внутри цикла:

for(const char *src = lineOfText; *src != '\0'; ++src) 
{ 
    const char here = *src; 
    if(here == '(') 
    ++noOfOpenPar; 
    else if(here == ')') 
    ++noOfClosePar; 
    else if ... /* more code here */ 
} 

Вы получаете идею. Вы могут также полагаться на буферизацию файла stdio и просто читать один символ за раз, что сократит количество циклов, но я думаю, что этот подход лучше.

Разумеется, его можно было бы сделать более управляемым данными, итерации через массив структур, содержащих символы для поиска и связанные с ними счетчики.

+0

Я получаю «сравнение между указателями и целыми» в (src == '(') – Rob

+0

'if (* src == '(')' –

+0

nvm решил это ... – Rob

Смежные вопросы