I'm making a program that accept 1 character long strings (and ignores spaces " ") until a user presses return/enter.

So far I have,

int main(){
    
    char expression[1];

    while ((scanf("%s",expression)) != EOF){

    //code

    }

    return 0;
}

it is assumed that the user is entering single digit strings (such as "a 1 2 3 d"(enter))


its seems to not like the while condition as it will keep accepting input even after I hit enter. I have tried using -1 instead of EOF but its the same output.

Any ideas?

I'll wait to see what the other people reading this thread have to say before giving you a good solution. :)

Number one I would change your expression to:

char expression;

and then call a %c in your scanf.

#include <stdio.h>

int main()
{
    
    char expression;

    while ((scanf("%c",&expression)) != EOF)
    {
      fprintf(stdout, "char->%c\n", expression);
    }

    return 0;
}

I'll wait to see what the other people reading this thread have to say before giving you a good solution. :)

is it a quick fix or a major overhaul?

Edited 6 Years Ago by BLUEC0RE: this is a not need post.

Number one I would change your expression to:

char expression;

and then call a %c in your scanf.

#include <stdio.h>

int main()
{
    
    char expression;

    while ((scanf("%c",&expression)) != EOF)
    {
      fprintf(stdout, "char->%c\n", expression);
    }

    return 0;
}

wow i feel really stupid right now (forgetting the & and what not).
But i need the while loop to exit when enter is selected. What you offered just loops after the enter is pressed.

It may be worthwhile to note that scanf ignores blank input, newline, and tab. (in the context you are using it)

What I mean by this, is that blank input is still input, not EOF.

Edited 6 Years Ago by Unimportant: n/a

Why scanf ? Are you familiar with getchar ? It's better suited for your needs. With getchar , it's as simple as

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

Also, if I remember correctly, using a char to check for EOF is not going to work, for char is an unsigned data type, while EOF is a negative one.

Edited 6 Years Ago by creeps: n/a

>it is assumed that the user is entering single digit strings (such as "a 1 2 3 d"(enter))
If all you want is single character input, you don't even need scanf. Just use getchar and test for whitespace manually:

int ch;

while ((ch = getchar()) != '\n' && ch != EOF) {
    if (isspace(ch))
        continue;

    printf("Processing '%c'\n", ch);
}

However, I have yet to see such a program that doesn't grow into more than single character words. In that case, scanf can be used without any problems provided the assumption holds that whitespace or end-of-file terminates each word.

One problem in this case is that scanf doesn't differentiate between newlines and other whitespace. It's all the same to scanf. But because scanf stops reading at whitespace, you can read the next character and see which one it was:

#include <stdio.h>

int main(void)
{
    char word[512];
    char next;

    while (scanf("%511s%c", word, &next) >= 1) {
        printf(">%s<\n", word);

        if (next == '\n')
            break;
    }

    return 0;
}

Thanks a lot guys! I don't specifically need to use scanf (I just thought it was useful that it skipped spaces). This cuts a lot of debugging out of my schedule.

Edited 6 Years Ago by BLUEC0RE: n/a

I'm making a program that accept 1 character long strings (and ignores spaces " ") until a user presses return/enter.

So far I have,

int main(){
    
    char expression[1];

    while ((scanf("%s",expression)) != EOF){

    //code

    }

    return 0;
}

it is assumed that the user is entering single digit strings (such as "a 1 2 3 d"(enter))


its seems to not like the while condition as it will keep accepting input even after I hit enter. I have tried using -1 instead of EOF but its the same output.

Any ideas?

I don't think anyone mentioned the potential for buffer overflow in the original program...That's why I mentioned changing the variable from a character array to a single character.

This question has already been answered. Start a new discussion instead.