Tandura Tandura - 1 month ago 12
C Question

Checking the stdin buffer if it's empty

I am trying to read a number character with character, but I don't know if the stdin buffer is empty or not.

My first solution whas to look for '\n' character in stdin buffer, but this is no good if I what to enter multiple numbers separated with ' '(blank space).

How can I know if in stdin buffer I have characters or not?

I nead to do it in C and to be portable.

Answer

There are a lot of soutions:

feof is preferred one for checking if buffer is empty.

if (!feof(stdin)) // Check if the stdin is empty
    // read stuff

poll or select with timeout of 0 - these would return immediately and result is either -1 with errno EAGAIN if no data available or number of descriptors with data (one, since you're checking only stdin).

ioctl is a swiss army knife of using descriptors. The request you need is I_NREAD:

if (ioctl(0, I_NREAD, &n) == 0 && n > 0)
    // we have exactly n bytes to read

However the correct solution is to read everything you got (using scanf) as a line, then process the result - and this works good enough with sscanf:

char buf[80]; // large enough
scanf("%79s", buf); // read everything we have in stdin
if (sscanf(buf, "%d", &number) == 1)
    // we have a number

... as long as you properly handle re-reading, strings that are longer than your buffer, and other real-life complications.

Comments