3


I'm prompting the user to enter the length of an array, initializing a char[] array with this input, and then prompting the user to type a message to enter into the char[] array.

I'm reading the first character of the user's message with getchar().

However, getchar() is reading the new-line escape '\n' before it is reading any user input. It seems to be getting '\n' from the previous printf statement that prompts the user...


Here is the relevant code:

#include <stdio.h>

int main(void) {

    int len = 0,
        originalLen = 0;

    printf("\n\nWhat is the length of the array? ");
    scanf("%d", &originalLen);
    char str[originalLen]; // intitializing the array

    printf("Enter a message to enter into the array: ");
    char target = getchar();
    str[len] = target;

    // why is getchar() reading '\n'?
    if (target == '\n') {
        printf("\n...what happened?\n");
    }
    return 0;
} // end of main


3 Answers 3

4

It's because the previous scanf does not read the newline after the number.

This can be solved two ways:

  1. Use e.g. getchar to read it
  2. Add a space after the scanf format (e.g. scanf("%d ", ...))
Sign up to request clarification or add additional context in comments.

2 Comments

Thanks @Joachim, so it seems that you have to use the extra space hack for scanf... is there a better alternative, or is this professionally accepted?
@IanCampbell I wouldn't call it a "hack", it simply tells scanf to read (and discard) whitespace. As for "professionally accepted", I've used it myself a lot and seen it in a lot of other code as well, so it's not uncommon.
3

You can use getchar in a loop to flush out stdin before reading the next character.

while((target = getchar()) != '\n' && target != EOF)

Comments

2

When you enter the number and hit the ENTER key, a number and a character are placed in the input buffer, they are namely:

  • The entered number and
  • The newline character(\n).

The number gets consumed by the scanf but the newline remains in the input buffer, which is read by getchar().

You need to consume the \n before calling getchar() by using:

scanf("%d ", &originalLen);
         ^^^

This tells scanf to read the number and an additional character, which is \n.

4 Comments

Ah thanks @Alok, that makes sense -- it's hitting the ENTER key that adds the '\n' character. Is scanf frowned upon for this reason?
@IanCampbell: Yes, for this and many more. such as: type safety, input validation and so on . It should be avoided while reading characters and strings but it is okay to use it for simple numeric inputs.
Thanks @Alok, interesting... so what's a better alternative to scanf for characters and Strings?
@IanCampbell: fgets always!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.