2017-02-22 16 views
0

У меня есть программа, которая получает пользовательский ввод с использованием fgets, но когда вход имеет пробелы, это кажется неустойчивым.Вход пользователя разделен на цикл

Так что, когда я входной файл 1, а затем нажмите клавишу ввода, это выход

`FilePlease enter your file Name` 
`1Please enter your file Name` 

Если сравнивать без пробелов, кажется, работает.

int MAX_NAME_SZ = 256; 
char * fileName = malloc (MAX_NAME_SZ); 

while (ValidateFileName(fileName) != 0) 
{ 
    printf("Please enter your file Name\n"); 
    fgets (fileName, MAX_NAME_SZ, stdin); 
} 

int ValidateFileName(char * fileName) 
{ 
    printf(fileName); 
    if ((strcmp(fileName, "File 1") == 0) || (strcmp(fileName, "File 2") == 0) || 
     (strcmp(fileName, "File 3") == 0) || (strcmp(fileName, "File 4") == 0) || 
     (strcmp(fileName, "File 5") == 0)) 
     return 0; 
    else 
     return 1; 
} 
+1

Вызов 'ValidateFilename()' в неинициализированной переменной - это неопределенное поведение. Также может быть полезно добавить '\ n' в' printf (filename) '. – John3136

+1

вы, вероятно, захотите сделать 'do {...} while (ValidateFileName (имя_файла)! = 0);' – bruceg

+0

@ John3136, в нем есть '' \ n'' из-за его происхождения ('fgets' обычно вставляет это). Это может быть проблемой. – Sebivor

ответ

0

Вы сравниваете «Файл 1» в «Файл 1 \ n». Измените вызовы strcmp на вызовы strncmp, например: (strncmp(fileName, "File 1", strlen("File 1")) == 0)

+1

Не очень надежное решение. Как насчет того, когда мы доберемся до «Файл 11»? Частью проблемы (см. Комментарии) является символ «\ n», который находится в одной строке, но не другой. – John3136

+0

Я думаю, что он прочный, но не расширяемый. :) Было бы лучше реализовать функцию стиля 'chomp', чтобы избавиться от конечного' \ n', но я подумал, что это будет самым быстрым решением для OP. – bruceg