Solved

How do I count spaces and newlines?

Posted on 2009-04-05
12
643 Views
Last Modified: 2012-05-06
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

0
Comment
Question by:prebek
  • 6
  • 3
  • 2
  • +1
12 Comments
 
LVL 53

Expert Comment

by:Infinity08
Comment Utility
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
 
LVL 7

Expert Comment

by:cmrobertson
Comment Utility
or a regular expression to count them
0
 
LVL 53

Expert Comment

by:Infinity08
Comment Utility
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
 
LVL 40

Expert Comment

by:mrjoltcola
Comment Utility
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
 
LVL 40

Expert Comment

by:mrjoltcola
Comment Utility
@cmrobertson: How would you count characters with a regex in a simple C program?
0
 

Author Comment

by:prebek
Comment Utility
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
Threat Intelligence Starter Resources

Integrating threat intelligence can be challenging, and not all companies are ready. These resources can help you build awareness and prepare for defense.

 
LVL 53

Accepted Solution

by:
Infinity08 earned 500 total points
Comment Utility
>>             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
 
LVL 53

Expert Comment

by:Infinity08
Comment Utility
Oh, and to get the number of characters on a line, you can make use of strlen.
0
 

Author Comment

by:prebek
Comment Utility
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
 
LVL 53

Expert Comment

by:Infinity08
Comment Utility
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
 

Author Closing Comment

by:prebek
Comment Utility
good fgets() suggestion, and the suggestion about pointers not equaling integer values was helpful too. thanks
0
 
LVL 53

Expert Comment

by:Infinity08
Comment Utility
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

Featured Post

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Suggested Solutions

Have you thought about creating an iPhone application (app), but didn't even know where to get started? Here's how: ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Important pre-programming comments: I’ve never tri…
Windows programmers of the C/C++ variety, how many of you realise that since Window 9x Microsoft has been lying to you about what constitutes Unicode (http://en.wikipedia.org/wiki/Unicode)? They will have you believe that Unicode requires you to use…
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use for-loops in the C programming language.
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use nested-loops in the C programming language.

771 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now