end = userinput[0];
сохраняет первый символ ввода. scanf("%[^\n]", userinput);
не помещает '\n'
в userinput[]
, поэтому проверка, является ли end
концом строки, бесполезна.
Используйте fgets()
, чтобы прочитать строку
char userinput[100];
if (fgets(userinput, sizeof userinput, stdin)) {
Затем отбросьте потенциал '\n'
с помощью различных средств .
size_t len = strlen(userinput);
if (len > 0 && userinput[len-1] == '\n') userinput[--len] = '\0';
Если код обязан использовать scanf()
,
int count;
do {
char userinput[100];
// Use a width limiter and record its conversion count : 1, 0, EOF
// scanf("%[^\n]", userinput);
count = scanf("%99[^\n]", userinput);
// Consume the next character only if it is `'\n'`.
// scanf("%*c");
scanf("%*1[\n]");
// Only save data if a non-empty line was read
if (count == 1) {
strcpy(inputstorage[i], userinput);
i++;
}
} while (count == 1);
// Input that begins with '\n' will have count == 0
Повторно сформированный цикл может использовать
char userinput[100];
int count;
while ((count = scanf("%99[^\n]", userinput)) == 1) {
scanf("%*1[\n]");
strcpy(inputstorage[i++], userinput);
}
scanf("%*1[\n]");
Обратите внимание, что код OP использует '/n'
в while (end != '/n');
. Это не символ конца строки '\n'
, а редко используемая многосимвольная константа. Конечно, не то, что хотел ОП. Это также подразумевало, что предупреждения не были полностью включены. Экономьте время, включите все предупреждения. @aschepler.