#include#define number 6
void allocate(); // 动态内存分配函数声明
char *p,*q; // 全局指针变量 p, q
// p用来存放分配内存的首地址
//q是p的备份,防止realloc返回NULL时p丢失
int main(){ // 主函数
int letter = 0, num = 0, blank = 0, others = 0;
allocate();
for(int k=0; p[k] != '\n'; k++){
if(isalpha(p[k])) letter++; //调用isalpha()函数判断是否为字母
else if(isdigit(p[k])) num++; //调用isdigit()函数判断是否为数字
else if(p[k] == ' ' ) blank++; //判断是否为空格
else others++; //判断其他字符
}
free(p); //释放申请的动态内存 ,防止内存泄漏
printf("%d %d %d %d\n", letter, num, blank, others);
return 0;
}
void allocate(){ // 动态内存分配函数
int i=0 ,j=0; // 字符串读取循环标志位
p = (char*)malloc(number*sizeof(char)); //先分配number大小的空间
if(p == NULL) // 判断是否分配成功
{
printf("Not Enough Memory!/n");
exit(1); //程序异常结束
}
memset(p,'\n',number); // 初始化分配的内存值为'\n'
while((i < number) && ((p[i] = getchar())!= '\n')){ //读入前number个字符 ,存放在p
i++;
}
int times=1; //times为扩大倍数
while(p[times*number-1]!='\n'){
q = p;
p = (char*)realloc(p,2*times*number*sizeof(char)); //扩大分配空间至原来的两倍
if(p == NULL) // 判断是否分配成功 //返回NULL时p被覆盖
{
printf("Not Enough Memory!/n");
free(q);//此时p已经丢失,释放备份q的内存 ,防止内存泄漏
exit(1);
}
memset(p+times*number,'\n',times*number); // 初始化新增加的内存值为'\n'
times=times*2; //扩大倍数翻倍
j = 0.5*times*number; // 新的读入起点
while((j < (times*number)) && ((p[j] = getchar())!= '\n')){ //读入times*number个字符 ,起点为p[j]
j++;
}
}
}
```