仔细查看你的函数声明
char *slova(const char *s){
^^^^^^^^^^^^^
它的参数是指针类型const char *。因此在此声明中
new = (char *)malloc(sizeof(s));
表达式sizeof(s) 产生的指针大小通常等于8 或4 字节,具体取决于所使用的系统。也就是这个表达式不提供传递字符串的长度。
也是这个循环的主体
for (int i = 0; i != '\0'; i++)
永远无法获得控制权,因为条件 i != '\0' 立即计算为 false,因为变量 i 被初始化为零。
该函数可以如下所示,如下面的演示程序所示。它不使用标题 <string.h> 中的函数。
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
char * slova( const char *s )
{
size_t n = 0;
for ( const char *t = s; *t != '\0'; ++t )
{
if ( isalpha( ( unsigned char )*t ) ) ++n;
}
char * result = malloc( ( n + 1 ) *sizeof( char ) );
if ( result != NULL )
{
char *p = result;
for ( ; *s; ++s)
{
if ( isalpha( ( unsigned char )*s ) )
{
*p++ = *s;
}
}
*p = '\0';
}
return result;
}
int main(void)
{
const char *s = "H#e#l#l#o W#o#r#l#d";
char *p = slova( s );
if ( p ) puts( p );
free( p );
return 0;
}
程序输出是
HelloWorld
如果您也不允许使用标题 <ctype.h> 中的函数,则该函数可以如下面的演示程序所示。
#include <stdio.h>
#include <stdlib.h>
char * slova( const char *s )
{
const char *upper_case = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const char *lower_case = "abcdefghijklmnopqrstuvwxyz";
size_t n = 0;
for ( const char *t = s; *t != '\0'; ++t )
{
const char *letter = lower_case;
if ( *t < lower_case[0] )
{
letter = upper_case;
}
while ( *letter && *letter < *t ) ++letter;
if ( *letter == *t ) ++n;
}
char * result = malloc( ( n + 1 ) *sizeof( char ) );
if ( result != NULL )
{
char *p = result;
for ( ; *s; ++s)
{
const char *letter = lower_case;
if ( *s < lower_case[0] )
{
letter = upper_case;
}
while ( *letter && *letter < *s ) ++letter;
if ( *letter == *s )
{
*p++ = *s;
}
}
*p = '\0';
}
return result;
}
int main(void)
{
const char *s = "H#e#l#l#o W#o#r#l#d";
char *p = slova( s );
if ( p ) puts( p );
free( p );
return 0;
}
程序输出又是
HelloWorld