K & R 1-24. Why does my program not verify the matching of single and double quotes?

Unreasonably complete source code:

#include <stdio.h>

main()
{
    int c;          //char read from stdin. Type is int to accomodate EOF
    int x;          //generic counter
    int nl_counter = 1; //new line counter
    int parens, brackets, braces, dubQuotes, singQuotes, comments;                                                  //stores number of unmatched pair occurences
    int parenLines[99], bracketLines[99], braceLines[99], dubQuoteLines[99], singQuoteLines[99], commentLines[99];      //stores lines of unmatched pair occurences
    int inParen, inBracket, inBrace, inDubQuote, inSingQuote, inComment;                                    //checks whether reading inbetween a potentially matching pair
    comments = parens = brackets = braces = dubQuotes = singQuotes = inComment = inParen = inBracket = inBrace = inDubQuote = inSingQuote = 0;  //initializes whether in matching pairs to zero
    for(x = 0; x < 99; x++)                                                                 //initialize line occurences with zero
    parenLines[x] = bracketLines[x] = braceLines[x] = dubQuoteLines[x] = singQuoteLines[x] = commentLines[x] = 0;   //


    //Read from stdin
    while((c = getc(stdin)) != EOF)         
    {       
        if(c == '\n')
            nl_counter++;


        if(c == '/' && inComment == 0)          //opens comment
        {
            c = getc(stdin);

            if(c == '*')
            {
                inComment = 1;
                commentLines[comments] = nl_counter;
                comments++;
            }
            else    if(c == '\n')
                nl_counter++;
        }   

        if(inComment == 1)                  //checks for close comment
        {
            if(c == '*')
            {
                c = getc(stdin);

                if(c == '/')
                {
                    inComment = 0;
                    comments--;
                }
                else    if(c == '\n')
                    nl_counter++;
            }
        }


        if(c == '(' && inComment == 0)          //opens parenthesis
        {
            inParen = 1;
            parenLines[parens] = nl_counter;
            parens++;
        }

        if(inParen == 1 && inComment == 0)          //checks for close parenthesis
        {
            if(c == ')')
            {
                inParen = 0;
                parens--;
            }
        }

        if(c == '[' && inComment == 0)          //opens bracket
        {
            inBracket = 1;
            bracketLines[brackets] = nl_counter;
            brackets++;
        }

        if(inBracket == 1 && inComment == 0)        //checks for close bracket
        {
            if(c == ']')
            {
                inBracket = 0;
                brackets--;
            }
        }

        if(c == '{' && inComment == 0)          //opens brace
        {
            inBrace = 1;
            braceLines[braces] = nl_counter;
            braces++;
        }

        if(inBrace == 1 && inComment == 0)          //checks for close brace
        {
            if(c == '}')
            {
                inBrace = 0;
                braces--;
            }
        }

        if(c == '\"' && inComment == 0 && inDubQuote == 0)              //opens dubQuote
        {
            inDubQuote = 1;
            dubQuoteLines[dubQuotes] = nl_counter;
            dubQuotes++;
        }
        else if(inDubQuote == 1 && inComment == 0)      //checks for close dubQuote
        {
            if(c == '\"')
            {
                inDubQuote = 0;
                dubQuotes--;
            }
        }

        if(c == '\'' && inComment == 0 && inSingQuote == 0)             //opens     single quote
        {
            inSingQuote = 1;
            singQuoteLines[singQuotes] = nl_counter;
            singQuotes++;
        }
        else if(inSingQuote == 1 && inComment == 0)     //checks for close             single quote
        {
            if(c == '\'')
            {
                inSingQuote = 0;
                singQuotes--;
            }
        }
    }



    //display collected data
    if(parens > 0)
    {
        for(x = 0; x < parens; x++)
            printf("unmatched parenthesis on line %d\n", parenLines[x]);


        printf("\n");
    }

    if(brackets > 0)
    {
        for(x = 0; x < brackets; x++)
            printf("unmatched bracket on line %d\n", bracketLines[x]);


        printf("\n");
    }

    if(braces > 0)
    {
        for(x = 0; x < braces; x++)
            printf("unmatched brace on line %d\n", braceLines[x]);

        printf("\n");
    }

    if(dubQuotes > 0)
    {
        for(x = 0; x < dubQuotes; x++)
            printf("unmatched double quote on line %d\n", dubQuoteLines[x]);

        printf("\n");
    }

    if(singQuotes > 0)
    {
        for(x = 0; x < singQuotes; x++)
            printf("unmatched single quote on line %d\n", singQuoteLines[x]);

        printf("\n");
    }

    if(comments > 0)
    {
        for(x = 0; x < comments; x++)
            printf("unmatched comment on line %d\n", commentLines[x]);

        printf("\n");
    }


    getc(stdin);        //wait for input before exit
    getc(stdin);        //
}

Less redundant source code (to the point):

#include <stdio.h>

main()
{
    int c;          //char read from stdin. Type is int to accomodate EOF
    int x;          //generic counter
    int nl_counter = 1; //new line counter
    int dubQuotes, singQuotes;                                  //stores number of unmatched pair occurences
    int dubQuoteLines[99], singQuoteLines[99];                      //stores lines of unmatched pair occurences
    int inDubQuote, inSingQuote;                                    //checks whether reading inbetween a potentially matching pair
    dubQuotes = singQuotes = inDubQuote = inSingQuote = 0;              //initializes whether in matching pairs to zero
    for(x = 0; x > 99; x++)                                     //initialize line occurences with zero
        dubQuoteLines[x] = singQuoteLines[x] = 0;                   //


    //Read from stdin
    while((c = getc(stdin)) != EOF)         
    {       
        if(c == '\n')
            nl_counter++;



        if(c == '\"' && inDubQuote == 0)                //opens dubQuote
        {
            inDubQuote = 1;
            dubQuoteLines[dubQuotes] = nl_counter;
            dubQuotes++;
        }
        else if(inDubQuote == 1)                    //checks for close dubQuote
        {
            if(c == '\"')
            {
                inDubQuote = 0;
                dubQuotes--;
            }
        }

        if(c == '\'' && inSingQuote == 0)               //opens single quote
        {
            inSingQuote = 1;
            singQuoteLines[singQuotes] = nl_counter;
            singQuotes++;
        }
        else if(inSingQuote == 1)                   //checks for close single quote
        {
            if(c == '\'')
            {
                inSingQuote = 0;
                singQuotes--;
            }
        }
    }



    //display collected data
    if(dubQuotes > 0)
    {
        for(x = 0; x < dubQuotes; x++)
            printf("unmatched double quote on line %d\n", dubQuoteLines[x]);

        printf("\n");
    }

    if(singQuotes > 0)
    {
        for(x = 0; x < singQuotes; x++)
            printf("unmatched single quote on line %d\n", singQuoteLines[x]);

        printf("\n");
    }

    getc(stdin);        //wait for input before exit
    getc(stdin);        //
}

I haven’t managed to write for escape sequences yet, but still, I don’t understand why all the brackets and curly braces work, but if I put "it and then after pressing enter and ^ z (EOF), it does not display my message “Unrivaled double quote in line 1 ". I compensated for the fact that they have the same character with if-else and extra && inSingQuote == 0/ && inDubQuote == 0in the initial check of the initial quote. I just do not see any holes in the logic.

+4
source share
1

reset inDubQuote 0, . , , , , ( ) .

printf ( if), , :

printf ("(%d)", nl_counter);

//Read from stdin
while((c = getc(stdin)) != EOF)         
{       
    if(c == '\n')
    {
        inDubQuote = 0;
        nl_counter++;
        printf ("(%d)", nl_counter);
    }


    if(c == '\"')
    {
        if (inDubQuote == 0)                //opens dubQuote
        {
            inDubQuote = 1;
            dubQuoteLines[dubQuotes] = nl_counter;
            printf ("I just set #%d to %d!\n", dubQuotes, nl_counter);
            dubQuotes++;
        }
        else                    //checks for close dubQuote
        {
            inDubQuote = 0;
            dubQuotes--;
            printf ("I just reset counter to #%d!\n", dubQuotes);
        }
    }

}

, :

~/Documents $ ./a.out
(1)a"bc"d
i just set #0 to 1!
i just reset counter to #0!
(2)e"f"g"h
i just set #0 to 2!
i just reset counter to #0!
i just set #0 to 2!
(3)i"j"k"l"m
i just set #1 to 3!
i just reset counter to #1!
i just set #1 to 3!
i just reset counter to #1!
(4)n"o"p"q
i just set #1 to 4!
i just reset counter to #1!
i just set #1 to 4!
(5)r"s"t"u"v
i just set #2 to 5!
i just reset counter to #2!
i just set #2 to 5!
i just reset counter to #2!
(6)^D
unmatched double quote on line 2
unmatched double quote on line 4

, , ( Begin/End). , , "" "" ; , "" , "" , .

+2

Source: https://habr.com/ru/post/1615567/


All Articles