Using fgets to read in a line is simpler and more reliable:
if (!fgets(buff, 28, stdin)) {
It does not work with scanf("%s",buff) because most scanf conversions ignore leading white space:
Entering space characters (as indicated by the isspace function) is skipped if the specification includes the [ , c or n specifier.
So, if the user enters an empty string, scanf ignores this entry if its format is not one of the exceptional ones.
Instead, you can use scanf with a character set format,
scanf("%27[^\n]%*c", buff);
to read all characters to a new line (but limited to 28 - 1 here to avoid buffer overflow), and then consume a new line without saving it ( * in the conversion specifier %*c suppresses the purpose), which processes non-empty lines consisting entirely of spaces , conversion %s will not. But if the first character of the input is a new line, the conversion %27[^\n] not performed (thanks chux , to draw attention to this), the new line remains in the input buffer and subsequent checks with this format will also fail if the new line does not will be removed from the input buffer.
A somewhat stable (but not ugly and not having too long input) loop using scanf , as far as I can see, should check for a new line before scanning, for example
for(int ct = 0; ct < i; ++ct) { int ch = getchar(); if (ch == EOF) { // something bad happened; we quit exit(EXIT_FAILURE); } if (ch == '\n') { // we had an empty line printf("\n\n"); } else { // The first character was not a newline, scanning // with the character set format would have succeeded. // But we don't know what comes next, so we put the // character back first. // Although one character of pushback is guaranteed, if (ungetc(ch,stdin) == EOF) { // pushback failed exit(EXIT_FAILURE); } scanf("%27[^\n]%*c",buff); printf("%s\n",buff); } }
Use fgets , really. This is better.