Параметр функции объявляется в объявлении функции как имеющий тип char
int* freqofchar(char);
^^^^^
Но в объявлении функции это же определение
int* freqofchar(char str[]){
^^^^^^^^^
. Параметр объявлен как имеющий тип char []
(который корректируется компилятором на тип char *
).
Эта опечатка является причиной сообщения компилятора.
Но в любом если функция должна быть объявлена как минимум как
unsigned int * freqofchar( const char [] );
То есть нет смысла определять частоты как имеющие целочисленный тип со знаком, а параметр должен иметь квалификатор const
, поскольку переданная строка не изменяется в функции.
Программа имеет неопределенное поведение, поскольку функция возвращает указатель на локальный массив с автоматическим c сроком хранения, который не будет активен после выхода из функции.
int* freqofchar(char str[]){
int freq[128] = {0};
//...
return freq;
}
Вы должны либо выделить массив динамически, либо объявить его с помощью спецификатора хранилища static
. В последнем случае вам нужно каждый раз при вызове функции сбрасывать элементы массива на нули.
Функция gets
является небезопасной функцией и больше не поддерживается стандартом C. Вместо этого используйте стандартную C функцию fgets
.
Вот демонстрационная программа.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
unsigned int* freqofchar( const char *);
int main( void )
{
enum { N = 100 };
char str[N];
str[0] = '\0';
printf( "Enter a sentence below : " );
fgets( str, N, stdin );
// remove the appended new line character '\n'
str[ strcspn( str, "\n" ) ] = '\0';
unsigned int *p = freqofchar( str );
for ( size_t i = 0; i < 128; i++ )
{
if ( p[i] )
{
printf( "'%c' occurred %u times\n", ( char )i , p[i] );
}
}
free( p );
return 0;
}
unsigned int * freqofchar( const char str[] )
{
enum { N = 128 };
unsigned int *freq = calloc( N, sizeof( unsigned int ) );
while ( *str ) ++freq[ ( size_t )*str++ ];
return freq;
}
Ее вывод может выглядеть как
Enter a sentence below : Hello World!
' ' occurred 1 times
'!' occurred 1 times
'H' occurred 1 times
'W' occurred 1 times
'd' occurred 1 times
'e' occurred 1 times
'l' occurred 3 times
'o' occurred 2 times
'r' occurred 1 times
Если определить функция со спецификатором хранения stati c, тогда ее определение может выглядеть следующим образом.
#include <stdio.h>
#include <string.h>
unsigned int* freqofchar( const char *);
int main( void )
{
enum { N = 100 };
char str[N];
str[0] = '\0';
printf( "Enter a sentence below : " );
fgets( str, N, stdin );
// remove the appended new line character '\n'
str[ strcspn( str, "\n" ) ] = '\0';
unsigned int *p = freqofchar( str );
for ( size_t i = 0; i < 128; i++ )
{
if ( p[i] )
{
printf( "'%c' occurred %u times\n", ( char )i , p[i] );
}
}
return 0;
}
unsigned int * freqofchar( const char str[] )
{
enum { N = 128 };
static unsigned int freq[N];
memset( freq, 0, N * sizeof( unsigned int ) );
while ( *str ) ++freq[ ( size_t )*str++ ];
return freq;
}