2015-06-09 3 views
1

согласно gcc предупреждения:Почему поведение отличается при fgets() используется вместо получает()

`получает функция опасна и не должна использоваться

Я пытаюсь использовать fgets(), но в моем коде он не просыпается, так как вы можете видеть выходы для обоих в конце кода ниже. Может кто-нибудь, пожалуйста, скажите мне, какую ошибку (если есть) я делаю?

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

#define size 128 

int Table[size]; 

/****ShiftTable Function Declaration****/ 
void ShiftTable(char Pattern[]); 

/****Horspool Function Declaration****/ 
int Horspool(char Pattern[],char Text[]); 

/****Main Function****/ 
int main() 
    { 
    char Text[100],Pattern[100]; 
    int pos; 

    printf("Enter the Text : "); 
    gets(Text);     //Works fine 
    //fgets(Text,100,stdin);  //Does not work 

    printf("\nEnter the Pattern: "); 
    gets(Pattern);     //Works fine 
    //fgets(Pattern,100,stdin); //Does not Work 

    pos=Horspool(Pattern,Text); 

    if(pos==-1) 
      printf("\nPattern Not Found!\n\n"); 
    else 
     printf("\nPattern Found at %d position.\n\n",pos+1);   

    return 0; 
    } 

/****Horspool Function Definition****/ 
int Horspool(char Pattern[],char Text[]) 
    { 
    int m,n,i,k; 

    n=strlen(Text); 
    m=strlen(Pattern); 

    ShiftTable(Pattern); 

    i=m-1; 

    while(i<n) 
     { 
     k=0; 
     while(k<m && (Text[i-k]==Pattern[m-1-k])) k++; 

     if(k==m) return i-m+1; 

     i+=Table[Text[i]]; 
     } 

    return -1; 
    } 

/****ShifTable Function Definition****/ 
void ShiftTable(char Pattern[]) 
    { 
    int i,m; 
    m=strlen(Pattern); 

    for(i=0;i<size;i++) 
     Table[i]=m; 

    for(i=0;i<m-1;i++) 
     Table[Pattern[i]]=m-1-i; 
    } 

Выход:

Когда я использую gets()

Маджид @ Маджид-K53SC: ~ $ ./a.out

Введите текст: BANGALORE IS GARDEN CITY

Ente r Выкройка: САД

Узор найден в 14 положении.

Когда я использую fgets()

Маджид @ Маджид-K53SC: ~ $ ./a.out

Введите текст: Бангалор GARDEN CITY

Введите Строчка: САД

Не найдена!

ответ

4

fgets потребляет символ новой строки (при нажатии Enter после ввода строки) и сохраняет его в Text пока gets нет. Вам нужно будет strip the newline character off от Text.

Таким образом, после того как призывы к gets,

Text = "BANGALORE IS GARDEN CITY" 
Pattern = "GARDEN" 

и в случае fgets,

Text = "BANGALORE IS GARDEN CITY\n" 
Pattern = "GARDEN\n" 
+0

Спасибо за ваш ответ и ссылку –

+0

Я попробовал два метода, указанные в ссылке, но они не сработали, я не знаю, в чем проблема ... Я устал от fgets()! скажите, пожалуйста, что не так: либо strtok (Pattern, "\ n"); или ln = strlen (Pattern); Образец [ln] = '\ 0'; позволяет перейти в бесконечный цикл! –

+0

@MajidNK, используйте 'size_t ln = strlen (Pattern); if (ln! = 0) Образец [ln-1] = '\ 0'; '. Вы можете сделать то же самое для 'Text', если хотите –

1

первых, спасибо за оплату внимания на предупреждения. Вы очень правы, чтобы перейти на fegts().

Теперь, чтобы ответить на ваш вопрос,

Почему поведение отличается при fgets() используется вместо получает()?

Это не странное поведение. Это ожидаемое поведение fgets().

В отличии от gets(), fgets()считывает и сохраняет заднего newline в прилагаемом входном буфер. Перед тем, как продолжить, вам нужно снять новую линию.

Без этого, по сути, ваши входы выглядеть следующим образом:

Text --> "BANGALORE IS GARDEN CITY\n" 
Pattern --> "GARDEN\n" 

Теперь, как мы знаем, "GARDEN " и "GARDEN\n" являются не же, поэтому ваше сравнение не удается.

Это, как правило, рекомендуемая подпись main(): int main(void).

+0

Спасибо за ваш ответ –