2013-10-05 3 views
0

Я пишу небольшую программу, чтобы проверить, как работает функция strcasestr.Ошибка при использовании fgets в C

Что ниже код делает:

  1. просит пользователя ввести строку текста.
    Пример первый вход: blah bla blah blah the Word we are looking for. Пример второй вход: Word

  2. Что программа должна напечатать это: Word we are looking for.

  3. Но это дает мне ошибку сегментации (ядро сбрасывали) ошибки.

Я подозреваю, что неправильно использую fgets(). Когда я запускаю программу, используя scanf, чтобы прочитать ввод (конечно, вводя первый вход без пробелов), он работает и дает мне ожидаемый результат.

Любая идея, что вызывает ошибку ошибки сегментации? Как исправить это?

#define _GNU_SOURCE 
#define max_buff 1000 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <ctype.h> 
char *answer; 
//char * strcasestr (const char *haystack, const char *needle); 

void strip_crlf(char* s); 

void strip_crlf(char* s) 
{ 
    char* p = strpbrk(s, "\r\n"); 
    if (p) *p = '\0'; 
} 

int main(){ 
    char fname[max_buff+1]; 
    char lname[max_buff+1]; 

    printf("Enter the line of text you are searching for "); 
    //scanf("%s", fname); 

    fgets(fname,max_buff,stdin); 
    //printf("%s",fname); 
    strip_crlf(fname); 

    printf("Enter the search term "); 
    //scanf("%s", lname); 
    fgets(lname,max_buff,stdin); 
    strip_crlf(lname); 
    //printf("%s",lname); 
    if((answer=strcasestr(fname,lname))!=NULL){ 

    // printf("now we have something in answer "); 
    printf("%s\n",answer); 
    } 
    else 
     printf(" strcasestr failed\n"); 

} 

EDITED: для отражения предложений, высказанных в комментариях/ответах ниже. программа теперь распечатывает:

strcasestr failed 

... Ughh.

Edit2: программа работает сейчас. спасибо за вашу помощь всем!

+1

FYI, вам не нужно 'max_buff + 1', так как' fgets() 'вычитает 1 из аргумента' size'. – Barmar

+1

Вы проверили, что 'answer' не' NULL'? – Barmar

+0

@Barmar ах yes.forgot, чтобы изменить его обратно b4, размещая i здесь. no i havnt. но strcasestr сделает это, только если он не сможет найти матч. с этими входами он должен быть в состоянии найти совпадение? – 3MIN3M

ответ

2

Вы не проверяете отказ от strcasestr(), который не работает, потому что вы не снимаете \n или \r\n со своих входов.

Единственный поиск, который будет успешным, - это если он соответствует концу первого ввода.

раздеться CRLF:

void strip_crlf(char* s) 
{ 
    char* p = strpbrk(s, "\r\n"); 
    if (p) *p = '\0'; 
} 

Тогда просто strip_crlf(fname); после fgets. То же самое для lname.

+0

Я только что проверил на случай сбоя, и это действительно не сработало или по какой-то причине .. почему ... плохо попробуйте приведенный выше код и вернитесь к вам. Спасибо! – 3MIN3M

+0

работает! Большое спасибо. застрял с этой ошибкой forevveeer! – 3MIN3M

2

Вы должны проверить, если сравнение успешно, прежде чем пытаться напечатать результат:

if (answer) { 
    printf("%s\n", answer); 
} else { 
    printf("No match\n"); 
} 

Причина сравнение не удается, вероятно, потому, что fgets() включает символ новой строки в буфере, но scanf() не делает. Вам нужно будет удалить новую строку в конце строки, если вы не хотите, чтобы это испортило сравнение.

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