Unnecessarily 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 unnecessarily complete 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 gotten to writing for escape sequences just yet, but still, I don't see why all the brackets and braces work, but if I put a "
and then after pressing enter and ^z(EOF), it doesn't display my "unmatched double quote on line 1" message. I compensated for the fact that theyre the same character with an if-else, and the additional && inSingQuote == 0
/ && inDubQuote == 0
in the initial checking for an opening quote. I just don't see any holes in the logic..