2015-11-09 3 views
-1

Я использую функцию strstr() для поиска строки, заданной пользователем в некоторой другой строке.Почему этот fgets() ведет себя странным образом?

Проблема в том, что когда я использую функцию fgets() для ввода ввода, функция strstr() задает нуль (false), даже если введенная пользователем строка.


Для примера:

char search[20]; //MAX size of search term is 20 bytes 
puts("Enter search term: "); 
fgets(search,20,stdin); //suppose user enters: photographer (12 characters long) 
if(strstr("I'm no photographer but I can picture us together",search)) 
    puts("Found!"); 
else 
    puts("No luck!"); 

Вывод: Не повезло!

Даже жесткий «фотограф» есть в строке


Однако, если я использую зсап(), чтобы принять поиск входа.

scanf("%19s",search); //like this 

Выходной: Найдено!


Почему это происходит?

+0

отладчик будет легко показан дополнительный вопрос обугленного. Downvote. –

+0

Я учусь, мне еще предстоит узнать, что такое gdb. скоро я это сделаю. – saintmarkode

ответ

1

Это происходит потому, что fgets() хранит новую строку строки trailin \n в конце строки, прочитанной. Таким образом, строка, которую вы читали в search основном "photographer\n"


Либо использовать scanf() или перезаписать нулевой символ \0 на новую строку.


Чтобы перезаписать на новой строке, вы можете сделать что-то вроде этого

l=strlen(search)-1; 
if(search[l]=='\n') 
    search[l]='\0'; 
+0

Действительно помогает человеку. Кроме того, я попытался распечатать каждый символ в десятичной (% d) формальной в строке поиска .. и я получил 10 на 13-м месте, которое является значением ASCII \ n..So, да. – saintmarkode

1

из руководства:

fgets() считывает максимум один меньше символов размера из потока и сохраняет их в буфер, на который указывает с. Чтение останавливается после EOF или новой строки. Если прочитана новая строка, она сохраняется в буфере r. Конечный нулевой байт ('\ 0') сохраняется после последнего символа в буфере.

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

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