函数参数在函数声明中声明为具有类型char
int* freqofchar(char);
^^^^^
但是在函数声明中,同样是它的定义
int* freqofchar(char str[]){
^^^^^^^^^
该参数被声明为具有类型char []
(由编译器调整为 type char *
)。
这个错字是编译器消息的原因。
但在任何情况下,该函数至少应声明为
unsigned int * freqofchar( const char [] );
也就是说,将频率定义为有符号整数类型是没有意义的,并且参数应具有限定符const
,因为传递的字符串在函数中没有被更改。
该程序具有未定义的行为,因为该函数返回指向具有自动存储持续时间的本地数组的指针,该数组在退出函数后将不再存在。
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
如果使用静态存储说明符定义函数,则其定义可以如下所示。
#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;
}