Loop and getchar problems

S

Samuel.Coddler

Hi,

I'm a newbie programmer. I can't get work the following code.

/*
Objective:

Use a loop to print out all of the input characters until a newline is
found.

*/


#include <stdio.h>

int main (){
/* Declare variable, Assign a initial value x. */
char a = 'x';

while (a != '\n') {


/* Get a user input */
a = getchar();

if (a == '\n'){
/* If the input is a new line, say good bye to user */
printf("\nThat's it for today.\n");

} else {
/* Prints a user input */
printf("%c",a);
}

}



return 1;
}
 
T

Tak

Hi,

I'm a newbie programmer. I can't get work the following code.

/*
Objective:

Use a loop to print out all of the input characters until a newline is
found.

*/

#include <stdio.h>

int main (){
/* Declare variable, Assign a initial value x. */
char a = 'x';

while (a != '\n') {

/* Get a user input */
a = getchar();

if (a == '\n'){
/* If the input is a new line, say good bye to user */
printf("\nThat's it for today.\n");

} else {
/* Prints a user input */
printf("%c",a);
}

}

return 1;

}

It's my program:
#include <stdio.h>

int main (){
char a;

while ((a = getchar()) != '\n') {
printf("%c",a);
}
printf("\nThat's it for today.\n");

return 1;
}

right??????
 
C

Chris Dollin

(e-mail address removed) wrote:

Minor notes (since Mark has started the major ones):
#include <stdio.h>

int main (){
/* Declare variable, Assign a initial value x. */

Pointless comment.
char a = 'x';

while (a != '\n') {


/* Get a user input */
Ditto.

a = getchar();

`getchar` returns `int`. So `a` should be `int`. (This is because
the result of `getchar` has to allow for every character /and/
EOF.)

(fx:snip)
return 1;

Not portable. 0, EXIT_SUCCESS, EXIT_FAILURE (those from stdlib)
are portable.
 
M

mark_bluemel

Hi,

I'm a newbie programmer. I can't get work the following code.

"I can't get work" doesn't tell me much about your problem.

Generally if there's a problem you need help with, it's helpful to
tell us
* What did you expect to happen?
* What did happen?

Your code works for me, and behaves exactly as I expect, but that's
not necessarily what you expected, so you probably need to tell us
what you expected.

I'll give you a hint - standard input is probably line-buffered...
 
S

Samuel.Coddler

Hi, Tak,

Your code is much clearner. But the result on my end is the same.

I wanna make the program so that the program prints all the inputs
until a user input a new like (generally by pressing return).

So, it should open for a new input.


That string "That's it for today" should be displayed only when a user
type a newline.
 
R

Richard Heathfield

Tak said:
It's my program:
#include <stdio.h>

int main (){
char a;

while ((a = getchar()) != '\n') {
printf("%c",a);
}
printf("\nThat's it for today.\n");

return 1;
}

right??????

Wrong. Well, you're right that it's your program, but you're wrong that
it's right. It's wrong.
 
M

mark_bluemel

"I can't get work" doesn't tell me much about your problem.

Generally if there's a problem you need help with, it's helpful to
tell us
* What did you expect to happen?
* What did happen?

Your code works for me, and behaves exactly as I expect, but that's
not necessarily what you expected, so you probably need to tell us
what you expected.
[Snip]

I'd better qualify my comments by saying that I didn't bother with the
nitpicking about whether you should declare main as "int main(void)"
or that a should be an int.
 
R

Richard Heathfield

(e-mail address removed) said:
"I can't get work" doesn't tell me much about your problem.

Actually, I think it tells you all you need to know.
 
M

mark_bluemel

(e-mail address removed) said:



Actually, I think it tells you all you need to know.

Meow! Harsh but essentially fair, I guess.

However, he did post a complete, compilable, relatively cleanly
formatted program - give him some points for that...
 
R

Richard Heathfield

(e-mail address removed) said:
Hi,

I'm a newbie programmer. I can't get work the following code.

Here's your program again, properly indented for readability:

#include <stdio.h>

int main()
{
/* Declare variable, Assign a initial value x. */
char a = 'x';

while(a != '\n')
{
/* Get a user input */
a = getchar();

if(a == '\n')
{
/* If the input is a new line, say good bye to user */
printf("\nThat's it for today.\n");
}
else
{
/* Prints a user input */
printf("%c", a);
}
}

return 1;
}

Problems:

1) a has a lousy name!
2) a has the wrong type - it should be int.

Whilst I wouldn't want to suggest that your program is otherwise devoid
of problems, it does appear to do what is asked of it, except in cases
where it hits the end-of-file, where it does get a bit messy, but you
presumably aren't worried about that.

For the record, here's how I'd have written it:

#include <stdio.h>

int main(void)
{
int ch = 0;
while((ch = getchar()) != EOF && ch != '\n')
{
putchar(ch);
}

printf("\nThat's it for today.\n");

return 0;
}
 
M

mark_bluemel

Hi, Tak,

Your code is much clearner. But the result on my end is the same.

I wanna make the program so that the program prints all the inputs
until a user input a new like (generally by pressing return).

That's what I thought you wanted - why didn't you say so in your
original posting.

What you are saying, I think, is that you want to read and echo the
characters typed as they are typed, without waiting for a line-full of
input. Am I right? I'll assume so.

Do you know, the C language specification doesn't give you a way that
you can guarantee to do this. Input will frequently be buffered, in
some way. You might spend some time with the FAQ at c-faq.com,
especially http://c-faq.com/stdio/index.html questions 12.1 and 12.5,
to understand about this and other issues with your code.
 
S

Samuel.Coddler

Thanks, guys. Sorry for my ill-mannered post.

I started programming a few days ago. I will read more about what you
wrote.

I need to spend more time before understanding your posts.

Regards,
 
B

Barry Schwarz

Hi,

I'm a newbie programmer. I can't get work the following code.
snip code

It helps a whole bunch if you tell us what is happening that is
different than what you expect.


Remove del for email
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,578
Members
45,052
Latest member
LucyCarper

Latest Threads

Top