Для начала, функция gets
небезопасна и не поддерживается стандартом C. Вместо этого используйте стандартную функцию C fgets
.
Поскольку введенная строка в целом может быть очень большой, тогда как буквы в строке, преобразованной в нижний регистр, могут находиться в диапазоне ['a', ' z '], то нет смысла объявлять такой большой массив как массив fre
, объявленный как.
int fre[MAX];
Так как вы уже включили заголовок <string.h>
, то нет смысла вручную вычислять длина введенной строки.
for(q=0;str[q];q++);
Для исключения небуквенных символов из подсчета можно использовать стандартную C функцию isalpha
объявленную в заголовке <ctype.h>
.
Pay Обратите внимание, что в общем случае введенная строка не может содержать букв.
Вот демонстрационная программа, которая показывает, как можно реализовать ваш подход.
#include <stdio.h>
#include <ctype.h>
int main(void)
{
enum { MAX = 1000 };
char s[MAX];
size_t frequency[ 'z' - 'a' + 1] = { 0 };
const size_t N = sizeof( frequency ) / sizeof( *frequency );
printf( "The string: " );
if ( fgets( s, MAX, stdin ) )
{
for ( const char *p = s; *p; ++p )
{
if ( isalpha( ( unsigned char )*p ) )
{
++frequency[tolower( ( unsigned char )*p ) - 'a'];
}
}
size_t min = 0;
for ( size_t i = 0; i < N; i++ )
{
if ( frequency[i] != 0 && ( min == 0 || frequency[i] < min ) )
{
min = frequency[i];
}
}
if ( min == 0 )
{
puts( "There ie no letters in the entered string." );
}
else
{
printf( "The letter with the minimum frequency is: " );
for ( size_t i = 0; i < N; i++ )
{
if ( frequency[i] == min ) printf( "%c ", ( int )('a' + i ) );
}
printf( "\nand the frequency is %zu\n ", min );
}
}
return 0;
}
Результат программы может выглядеть как
The string: Hi, how is the weather todayy Dor
The letter with the minimum frequency is: s
and the frequency is 1