Невозможно найти символ с вводом строки из fgets - PullRequest
1 голос
/ 30 мая 2019

Я пишу программу для поиска местоположения определенного символа в строке, используя strchr. При использовании fgets для ввода строки от пользователя программа не выполняется должным образом.

Однако при использовании gets все работает нормально.

Код, который работает с использованием gets():

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

int main() {
    char let;
    char input[50];
    char *ptr;
    printf("what is the string that you would like to check?\n");
    gets(input);
    printf("what is the character that you would like to find?\n");
    let = getchar();
    printf("in string \"%s\"...\n", input);
    ptr = strchr(input, let);
    while (ptr != NULL) {
        printf("the letter %c was found at character %d\n", let, ptr - input + 1);
        ptr = strchr(ptr + 1, let);
    }
    return 0;
}

Выход:

what is the string that you would like to check?
what is the character that you would like to find?
in string "why is the world when wondering"...
the letter w was found at character 1
the letter w was found at character 12
the letter w was found at character 18
the letter w was found at character 23

Код, который не работает usgin fgets():

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

int main() {
    char let;
    char input[50];
    char *ptr;
    printf("what is the string that you would like to check?\n");
    fgets(input, 16, stdin);
    printf("what is the character that you would like to find?\n");
    let = getchar();
    printf("in string \"%s\"...\n", input);
    ptr = strchr(input, let);
    while (ptr != NULL) {
        printf("the character is found at %d \n", ptr - input + 1);
        ptr = strchr(ptr + 1, let);
    }
    return 0;
}

Выход:

what is the string that you would like to check?
what is the character that you would like to find?
in string "abcdefghijklmno"...

Ответы [ 2 ]

2 голосов
/ 30 мая 2019

Изменить

fgets(input, 16, stdin)

на

fgets(input, sizeof(input), stdin)

Когда вы передаете аргумент от 16 до fgets(), вы указываете ему прочитать не более 15 символов.Почему?

Из справочной страницы fgets():

fgets () читает из потока не более одного символа размером и сохраняет их в буферена который указывает s.

Если вы предоставите более size -1 символов , оставшиеся символы останутся во входном буфере .

Затем, когда программа впоследствии вызывает

let = getchar();

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

0 голосов
/ 30 мая 2019

В первом фрагменте кода вызов

gets (input);

не ограничивает количество символов, которое может ввести пользователь. Учтите, что функция gets не поддерживается стандартом C и небезопасна.

Во втором фрагменте кода вы объявили переменную input как

char input[50];

Так что более естественно назвать fgets следующим образом

fgets (input,sizeof( input ),stdin );

вместо

fgets (input,16,stdin);

Стандартная функция getchar читает любой символ, включая пробелы.

Так что вместо него гораздо лучше использовать

scanf( " %c", &let );

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

...