Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > Getc or Getchar is not reading data

Reply
Thread Tools

Getc or Getchar is not reading data

 
 
mailursubbu@gmail.com
Guest
Posts: n/a
 
      01-02-2006
HI,
Below is my program. I compiled it through g++. Now strange thing is,
getc is not reading the data instead its printing the previously read
data ! Please some one let me know whats wrong.

#include<stdio.h>
int main()
{

int a;
char c;
scanf("%d",&a);
printf("%d",a);
c = getc(stdin);
printf("%c",c);
}

Thanks In advance.
Subra

 
Reply With Quote
 
 
 
 
Richard Heathfield
Guest
Posts: n/a
 
      01-02-2006
http://www.velocityreviews.com/forums/(E-Mail Removed) said:

> HI,
> Below is my program. I compiled it through g++. Now strange thing is,
> getc is not reading the data instead its printing the previously read
> data ! Please some one let me know whats wrong.
>
> #include<stdio.h>
> int main()
> {
>
> int a;
> char c;
> scanf("%d",&a);


Read an int's value from the text representation given in stdin. Assuming
nothing goes wrong, that will be read correctly, and the /next/ thing in
the stream - which scanf will take a quick peek at and then quietly stick
back onto the input stream - will be a character that can't be interpreted
as part of the int. For example, it might be a newline character pressed by
the user to indicate that he's finished entering a line of information.

> printf("%d",a);
> c = getc(stdin);


Ah, let's go and collect that newline character.

> printf("%c",c);


And now let's display it.

> }
>
> Thanks In advance.


Yes. That's basically the problem here.

By the way, don't forget that main returns an int, so it's best to return an
int from main. In the absence of anything better to return, I suggest 0.

--
Richard Heathfield
"Usenet is a strange place" - dmr 29/7/1999
http://www.cpax.org.uk
email: rjh at above domain (but drop the www, obviously)
 
Reply With Quote
 
 
 
 
mailursubbu@gmail.com
Guest
Posts: n/a
 
      01-02-2006
Then how can I read the Integer and the Character ?? Any solution ???
Its happening consistantly on windows as well as on Linux...

 
Reply With Quote
 
M.B
Guest
Posts: n/a
 
      01-02-2006
use one more getchar/getc (to read newline) after reading integer and
before reading the character
or
use scanf to read character also

Thanks
M.B

 
Reply With Quote
 
Emmanuel Delahaye
Guest
Posts: n/a
 
      01-02-2006
(E-Mail Removed) a crit :
> Below is my program. I compiled it through g++.


If you are not using a C compiler, all bets are off. Please use gcc or
the like.

> Now strange thing is,
> getc is not reading the data instead its printing the previously read
> data ! Please some one let me know whats wrong.
>
> #include<stdio.h>
> int main()
> {
>
> int a;
> char c;
> scanf("%d",&a);


scanf() is a tricky function that you are using badly:

- missing test of the returned value
- missing purge of pending characters.

> printf("%d",a);
> c = getc(stdin);


Due to the missing purge, getc() reads without waiting. Note that getc()
returns an int and not a char.

> printf("%c",c);
> }


Better to use fgets() unless you spend a long time to learn how to use
scanf() correctly.

--
A+

Emmanuel Delahaye
 
Reply With Quote
 
pemo
Guest
Posts: n/a
 
      01-02-2006

<(E-Mail Removed)> wrote in message
news:(E-Mail Removed) ups.com...
> Then how can I read the Integer and the Character ?? Any solution ???
> Its happening consistantly on windows as well as on Linux...


scanf(...)

while(getchar() != '\n')
;

c = getchar();


 
Reply With Quote
 
Richard Heathfield
Guest
Posts: n/a
 
      01-02-2006
(E-Mail Removed) said:

> Then how can I read the Integer and the Character ?? Any solution ???
> Its happening consistantly on windows as well as on Linux...


Yes, it would. Firstly, I forgot to observe last time that you are using
g++, which is a C++ compiler rather than a C compiler. I suggest you use
gcc if you wish to program in C. If you prefer to program in C++, please
ask your C++ questions in comp.lang.c++. Thank you.

Secondly, I would suggest that, to deal with text input of any kind, you
read it as a string with fgets, and then do any necessary conversions of
the data yourself using, for example, strtol or sscanf. Otherwise you'll
just litter your code with getchar calls, at the expense of clarity.

--
Richard Heathfield
"Usenet is a strange place" - dmr 29/7/1999
http://www.cpax.org.uk
email: rjh at above domain (but drop the www, obviously)
 
Reply With Quote
 
pemo
Guest
Posts: n/a
 
      01-02-2006

"Richard Heathfield" <(E-Mail Removed)> wrote in message
news:dpb8cr$avi$(E-Mail Removed)-infra.bt.com...
> (E-Mail Removed) said:
>
>> Then how can I read the Integer and the Character ?? Any solution ???
>> Its happening consistantly on windows as well as on Linux...

>
> Yes, it would. Firstly, I forgot to observe last time that you are using
> g++, which is a C++ compiler rather than a C compiler. I suggest you use
> gcc if you wish to program in C. If you prefer to program in C++, please
> ask your C++ questions in comp.lang.c++. Thank you.
>
> Secondly, I would suggest that, to deal with text input of any kind, you
> read it as a string with fgets, and then do any necessary conversions of
> the data yourself using, for example, strtol or sscanf. Otherwise you'll
> just litter your code with getchar calls, at the expense of clarity.


Wouldn't something like this work ...

/* could perhaps pass in the buffer size too */
int stdinGet(const char * format, void ** dest)
{
char buffer[100];

if(fgets(buffer, sizeof(buffer), stdin))
{
return sscanf(buffer, format, &(*dest));
}

return 0;
}

int main(void)
{
int n;
char buffer[100];

stdinGet("%d", (void *)&n);

printf("%d\n", n);

stdinGet("%s", (void *)buffer);

printf("%s\n", buffer);

return 0;
}


 
Reply With Quote
 
pemo
Guest
Posts: n/a
 
      01-02-2006

"pemo" <(E-Mail Removed)> wrote in message
news:dpbkio$hap$(E-Mail Removed)...
>
> "Richard Heathfield" <(E-Mail Removed)> wrote in message
> news:dpb8cr$avi$(E-Mail Removed)-infra.bt.com...
>> (E-Mail Removed) said:
>>
>>> Then how can I read the Integer and the Character ?? Any solution ???
>>> Its happening consistantly on windows as well as on Linux...

>>
>> Yes, it would. Firstly, I forgot to observe last time that you are using
>> g++, which is a C++ compiler rather than a C compiler. I suggest you use
>> gcc if you wish to program in C. If you prefer to program in C++, please
>> ask your C++ questions in comp.lang.c++. Thank you.
>>
>> Secondly, I would suggest that, to deal with text input of any kind, you
>> read it as a string with fgets, and then do any necessary conversions of
>> the data yourself using, for example, strtol or sscanf. Otherwise you'll
>> just litter your code with getchar calls, at the expense of clarity.

>
> Wouldn't something like this work ...
>
> /* could perhaps pass in the buffer size too */
> int stdinGet(const char * format, void ** dest)
> {
> char buffer[100];
>
> if(fgets(buffer, sizeof(buffer), stdin))
> {
> return sscanf(buffer, format, &(*dest));
> }
>
> return 0;
> }



int stdinGet(const char * format, void ** dest)
{
char buffer[100];

if(fgets(buffer, sizeof(buffer), stdin))
{
return sscanf(buffer, format, &(*dest));
}

return 0;
}

What's the type of the *dest above?

When used like this ...

int n;

stdinGet("%d", (void *)&n);

The routine's fine, but, if dest's type is changed to void *, gcc complains
about a void * dereference. This seems like a right hack to me - my code
above - but *as ever*, I'm confused: About the type of *dest, why the
compiler doesn't complain about the code 'as is', and why the call to the
routine with 'just' a void * cast isn't complained about - the expression
casts the int * to a void *, yet when this address is passed to stdinGet as
a void **, there's no complaint.



 
Reply With Quote
 
Emmanuel Delahaye
Guest
Posts: n/a
 
      01-02-2006
pemo a écrit :
> Wouldn't something like this work ...


Hardly... (BTW, <stdio.h> is missing)

123456
123456

æ╣└w◄

> /* could perhaps pass in the buffer size too */
> int stdinGet(const char * format, void ** dest)


void ** ? Scary !

> {
> char buffer[100];
>
> if(fgets(buffer, sizeof(buffer), stdin))
> {
> return sscanf(buffer, format, &(*dest));


This '&(*' thingy sounds weird...

> }
>
> return 0;
> }
>
> int main(void)
> {
> int n;
> char buffer[100];
>
> stdinGet("%d", (void *)&n);


Don't use cast to hide bad pratices... It's evil and will bite you some
day...

> printf("%d\n", n);
> stdinGet("%s", (void *)buffer);


Are you a member of the random programming cult ?

> printf("%s\n", buffer);
> return 0;
> }


Devillish... Far enough to burn in Hell...

Why do you return the value of sscanf() if you never test it ?

--
A+

Emmanuel Delahaye
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
getchar() reading alphanumeric data White Spirit C Programming 1 02-11-2006 10:57 PM
getc() vs. fgetc() William L. Bahn C Programming 13 07-21-2004 04:16 AM
detect Ctrl+C with getc ? PL C Programming 2 06-01-2004 04:40 AM
getc() only returns 1500 chars on a 5 Meg file spike C Programming 9 02-27-2004 04:31 AM
Re: getc hanging Irrwahn Grausewitz C Programming 1 08-31-2003 04:48 PM



Advertisments