Я пишу программу, чтобы найти местоположение определенного символа в строке, используя 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

Код, который не работает с использованием 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"...
1
morpheus 30 Май 2019 в 13:51

2 ответа

Лучший ответ

+ Изменить

fgets(input, 16, stdin)

Кому

fgets(input, sizeof(input), stdin)

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

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

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

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

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

let = getchar();

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

2
David Collins 30 Май 2019 в 13:01

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

gets (input);

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

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

char input[50];

Поэтому более естественно назвать fgets следующим образом

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

Вместо

fgets (input,16,stdin);

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

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

scanf( " %c", &let );

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

0
Vlad from Moscow 30 Май 2019 в 11:47