• C

How do I count spaces and newlines?

I want to create a program that reads a sentence that you type and tells you how many spaces, newlines, and letters are in that sentence
nt main () {
    int count;
	int spaces = 0;
	int newline = 0;
	printf("Type a sentence: ");
	while ((count = getchar()) != '\0')
	{
		if(count == ' ')
			spaces ++;
		if(count == '\n')
			newline ++;
		putchar(count);
    }
	printf("I counted %d spaces, %d newline characters, and %d total characters.\n", spaces , newline, (count - spaces - newline));
 
	return 0;
}

Open in new window

prebekAsked:
Who is Participating?
 
Infinity08Connect With a Mentor Commented:
>>             int CHARACTERS;
>>     char count[CHARACTERS];

You need to specify a certain size here for the array, like 1024 for example. Pick a size that will cover the longest line of text.

You probably also want to choose a more fitting variable name, like 'line' for example, rather than 'count'.


>>       int i;

You need to initialize this variable (to 0).


>>             CHARACTERS = fgets(count, 20, stdin);

fgets does not return an integer value. It returns a pointer to the string it just read (or NULL if reading failed for some reason). See the reference page I posted earlier for more detail.

You'll also want to call fgets in a loop, to get all lines of input, and you'll want to match the second argument to the size of the C string (1024 for example).


>>             if(count[i] == '\n')
>>                   newline ++;

You don't really need to check for this, since you know there will be one newline character for each line you read with fgets.
0
 
Infinity08Commented:
Except that getchar won't return '\0' to signify the end of the input, that looks ok.

Why not use fgets to read an entire line of input into a C string, and then loop over every character of that string ?

        http://cplusplus.com/reference/clibrary/cstdio/fgets.html
0
 
cmrobertsonCommented:
or a regular expression to count them
0
IT Degree with Certifications Included

Aspire to become a network administrator, network security analyst, or computer and information systems manager? Make the most of your experience as an IT professional by earning your B.S. in Network Operations and Security.

 
Infinity08Commented:
Oh, and in case that wasn't clear ... My approach makes it easy to count newlines, as each line read with fgets has exactly one newline character (per definition) - so you don't really need to check for newline characters ;) You simply count the number of fgets's :)
0
 
mrjoltcolaCommented:
As Infinity said, you need to use (while(count = getchar()) != EOF), don't use '\0'

Also, you are using 'count' in the end for some arithmetic, but it has no sum/number in it, its used in your program just to read a character. So you need to use 2 different variables, and at least increment count every loop.



0
 
mrjoltcolaCommented:
@cmrobertson: How would you count characters with a regex in a simple C program?
0
 
prebekAuthor Commented:
Infinity, I used your fgets approach and I implemented arrays as well. Now it reads spaces and newlines well, but it gives a a strange number format for the number of letters. Why is that?

int main ()
      {
            int CHARACTERS;
    char count[CHARACTERS];
      int i;
      int spaces = 0;
      int newline = 0;
      printf("Type a sentence: ");
            CHARACTERS = fgets(count, 20, stdin);
      while (count[i] != '\0')
      {
            if(count[i] == ' ')
                  spaces ++;
            if(count[i] == '\n')
                  newline ++;
            i++;
//            putchar(count);
    }
      printf("I counted %d spaces, %d newline characters, and %d letters.\n", spaces , newline, (CHARACTERS-spaces-newline));

      return 0;
}
0
 
Infinity08Commented:
Oh, and to get the number of characters on a line, you can make use of strlen.
0
 
prebekAuthor Commented:
Ok, I initialized i and CHARACTERS like you suggested, and it seems to work now. Let me know if you see anything wrong:

int main ()
      {
            int CHARACTERS = 50;
    char count[CHARACTERS];
      int i = 0;
      int spaces = 0;
      int newline = 0;
      printf("Type a sentence: ");
            CHARACTERS = printf("%s", fgets(count, 20, stdin));
      while (count[i] != '\0')
      {
            if(count[i] == ' ')
                  spaces ++;
            if(count[i] == '\n')
                  newline ++;
            i++;
//            putchar(count);
    }
      printf("I counted %d spaces, %d newline characters, and %d total characters.\n", spaces , newline, (CHARACTERS-spaces-newline));

      return 0;
}
0
 
Infinity08Commented:
The other things I pointed out ;)


>> You probably also want to choose a more fitting variable name, like 'line' for example, rather than 'count'.

>> >>             CHARACTERS = fgets(count, 20, stdin);
>> 
>> fgets does not return an integer value. It returns a pointer to the string it just read (or NULL if reading failed for
>> some reason). See the reference page I posted earlier for more detail.
>> 
>> You'll also want to call fgets in a loop, to get all lines of input, and you'll want to match the second argument to the
>> size of the C string (1024 for example).

>> >>             if(count[i] == '\n')
>> >>                   newline ++;
>> 
>> You don't really need to check for this, since you know there will be one newline character for each line you read
>> with fgets.
0
 
prebekAuthor Commented:
good fgets() suggestion, and the suggestion about pointers not equaling integer values was helpful too. thanks
0
 
Infinity08Commented:
May I ask why you gave a B grade ? That usually means that something was missing in the answer and/or that something was still unclear. If so, then please do not hesitate to ask for clarification.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.