Я пишу программу, чтобы найти местоположение определенного символа в строке, используя 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"...
2 ответа
+ Изменить
fgets(input, 16, stdin)
К
fgets(input, sizeof(input), stdin)
Когда вы передаете аргумент 16
в fgets()
, вы указываете ему прочитать не более 15 символов . Зачем?
Из справочной страницы fgets()
:
fgets () читает из потока не более символов размером и сохраняет их в буфере, указанном s.
Если вы предоставите более size -1
символов , оставшиеся символы останутся во входном буфере .
Затем, когда программа впоследствии вызывает
let = getchar();
let
присваивается независимо от следующего символа во входном буфере - даже не дожидаясь, пока вы наберете что-нибудь еще. Затем он ищет этот символ в предоставленной вами строке, но в приведенном вами примере его не находит.
В первом фрагменте кода вызов
gets (input);
Не ограничивает количество символов, которые может ввести пользователь. Учтите, что функция gets
не поддерживается стандартом C и небезопасна.
Во втором фрагменте кода вы объявили переменную input
как
char input[50];
Поэтому более естественно назвать fgets
следующим образом
fgets (input,sizeof( input ),stdin );
Вместо того
fgets (input,16,stdin);
Стандартная функция getchar
читает любой символ, включая пробелы.
Так что вместо этого его гораздо лучше использовать
scanf( " %c", &let );
В противном случае getchar
может прочитать любой символ (включая, например, символ новой строки), оставленный во входном буфере. В то время как вызов scanf
пропустит любой символ пробела.
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.