2014-09-02 3 views
-2

Я запрашиваю у пользователя имя файла, но как только пользователь нажимает клавишу ввода, он также принимает это в имя файла. поэтому файл не найден.fgets Представляем новую строку во вход пользователя

int main(){ 
char file[100]; 
FILE *fp; 

printf("Please enter a valid filename:\n"); 
fgets(file,100,stdin); 
fp=fopen(file, "r"); 

if(!fp){ 
printf("File not found.\n"); \\This will always happen because a new line is added to the user's input. 
return 1;} 

Если я использую

scanf("%s", file); 

Вопрос не бывает, но я слышал зсапЕ не хорошая функция для использования и вводит новые проблемы. Как я могу решить новую проблему с fgets?

+1

Но также см [При использовании получает, чтобы получить имя файла в C, файл открывается, но при использовании fgets он не] (http://stackoverflow.com/q/25311542/1281433), и [ fgets() Не игнорирует новую строку] (http://stackoverflow.com/q/21270323/1281433). –

+1

-1 для «Этот вопрос не показывает никаких исследований». [Поиск Google для 'fgets Представляем новую строку на входном сайте пользователя: stackoverflow.com'] (https://www.google.com/search?q=fgets+Introducing+new+line+in+user%27s+input + site% 3Astackoverflow.com) (то есть * название этого вопроса *) вызывает этот дубликат в качестве третьего результата. –

ответ

1

После fgets(file,100,stdin);, сделайте это file[strlen(file)-1]='\0';, он удалит \n с кодом. Чтобы использовать функцию strlen(), вам необходимо включить в код код string.h.

Попробуйте этот измененный код:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main(){ 

    char file[100]; 
    FILE *fp; 

    printf("Please enter a valid filename:\n"); 

    fgets(file,100,stdin); 
    file[strlen(file)-1]='\0'; //Removing \n from input 
    fp=fopen(file, "r"); 

    if(fp==NULL) 
    { 
     printf("File not found.\n"); 
     return 1; 
    } 
    else 
    { 
     printf("File found!\n"); 
     fclose(fp); 
     return 0; 
    } 
} 
-2

fgets() возвращает \ п новый линейный код .... это то, что он делает. Вы должны уничтожить этого персонажа.

Учитывая, что переполнение или, по крайней мере, полное заполнение, входящие буферы являются популярным вектором атаки, я предпочитаю код, защищающий от такого.

 
char *cp; 
file[(sizeof file)-1)] = '\0'; /* assure \0 termination on buffer fill attack */ 
cp = strchr(file, '\n');  /* find expected \n, but allow for none */ 
if (cp) *cp = '\0';   /* safely clear closing \n */
+0

Ваше сердце находится в правильном месте, но проверка '\ 0' не мешает чтению неинициализированных данных. Вместо этого вы можете проверить возвращаемое значение 'fgets'. Если он перенастраивает «NULL», то не читает «файл» вообще; в противном случае вы можете быть уверены, что буфер содержит строку. –

+0

Задача: некоторое время с тех пор, как вы написали свой комментарий, НО ничто в ваших словах не касается полного состояния полного буфера, с которым я защищаю. Конечно, fgets() возвращает NULL в EOF/Error, но это еще одна ошибка. Я защищаю от перекрывающихся имен, где окончательные \ n \ 0 не отправляются, потому что они выходят за пределы буфера. Никакие хорошие fputs() не должны допускать этого (но у меня есть два дополнительных защитных байта, опасаясь багги fgets()). Ничто в возвращаемом значении fgets() не дает вам полного буфера подсказки. Назовите меня параноидальным, но я боюсь, что условия переполнения буфера происходят случайно или по дизайну. – Gilbert

Смежные вопросы