Vayn Vayn - 3 months ago 16
C Question

fgets doesn't work after scanf

#include <stdio.h>
#include <string.h>
#include <ctype.h>

void delspace(char *str);

int main() {
int i, loops;
char s1[101], s2[101];

scanf("%d", &loops);

while (loops--) {
fgets(s1, 101, stdin);
fgets(s2, 101, stdin);
s1[strlen(s1)] = '\0';
s2[strlen(s2)] = '\0';

if (s1[0] == '\n' && s2[0] == '\n') {
printf("YES\n");
continue;
}

delspace(s1);
delspace(s2);

for (i = 0; s1[i] != '\0'; i++)
s1[i] = tolower(s1[i]);

for (i = 0; s2[i] != '\0'; i++)
s2[i] = tolower(s2[i]);

if (strcmp(s1, s2) == 0) {
printf("YES\n");
}
else {
printf("NO\n");
}
}

return 0;
}

void delspace(char* str) {
int i = 0;
int j = 0;
char sTmp[strlen(str)];

while (str[i++] != '\0') {
if (str[i] != ' ') {
sTmp[j++] = str[i];
}
}
sTmp[j] = '\0';
strcpy(str, sTmp);
}


After I entered "loops", "s1" was assigned a blank line automatically. How does it happen? I'm sure my keyboard works fine.

Answer

scanf() reads exactly what you asked it to, leaving the following \n from the end of that line in the buffer where fgets() will read it. Either do something to consume the newline, or (my preferred solution) fgets() and then sscanf() from that string.