//题目57:编写一个业务函数,实现字符串(前后各有三个空格,单词前后也均有空格)
//" i am student, you are teacher " ,
//各个单词首字符大写,结果如下" i am student, you are teacher " ,
//要求1:实现所有接口 70
//要求2:写出测试程序 30
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//需求解析:实现英语句子中各个单词首字符大写(字符串不确定)
//思路:①遍历句子中所有的字符,找出所有的空格
//②只要发现非空格,就将字符一个个存入数组中,直到遇到空格位置,生成一个字符串数组,数组中存储所有的单词
//③ 重新拼接英文句子
//处理英语句子
int ProtectEnglish(const char * pinstr/*in*/, char *pout/*in*/){
int ERRO_MSG = 0;
if (pinstr == NULL || pout == NULL)
{
ERRO_MSG = 1;
printf("pinstr == NULL || pout==NULL erro msg:%d\n", ERRO_MSG);
return ERRO_MSG;
}
int i = 0, j = 0,k=3;
//获取字符串的长度
int index = strlen(pinstr);
int index2 = index;
//定义返回字符串
char *resstr = pout;
memset(resstr, 0, sizeof(char)*(index + 1));
//定义单词个数
int numx = 0;
//定义存储字符串的二维数组
char **ptemp1 = (char **)malloc(sizeof(char *));
//定义单词个数
int num2 = 0;
//定义单词中字符个数
int num = 1;
//分配单个单词存数数组
char *ptemp2 = NULL;
while (index--){
if (*pinstr!=' ')
{
char tempc = 0;
if (num==1)
{
ptemp2 = (char *)malloc(sizeof(char));
//处理非字母字符
if ((int)*pinstr>96 && (int)*pinstr<123)
{
//首字母大写
tempc = (int)*pinstr - 32;
}
else{
tempc = *pinstr;
}
}
else{
//重新分配内存空间
ptemp2 = (char *)realloc(ptemp2, sizeof(char)*(num));
tempc = *pinstr;
}
//存储单个字符
ptemp2[num - 1] = tempc;
num++;
}
else{
//当遇到空格时开始计数下一个单词
if (num>1)
{
//确保每个单词都是字符串
ptemp2 = (char *)realloc(ptemp2, sizeof(char)*(num));
ptemp2[num - 1] = '\0';
if (num2>0)
{
ptemp1 = (char **)realloc(ptemp1, sizeof(char *)*(num2+1));
}
//将上一个单词加入数组
ptemp1[num2] = ptemp2;
num2++;
//开始下一个单词
num = 1;
}
}
pinstr++;
}
//重新拼接单词
if (num2>0)
{
//前后各有三个空格,单词前后也均有空格
resstr[0] = ' ';
resstr[1] = ' ';
resstr[2] = ' ';
resstr[index2 - 1] = ' ';
resstr[index2 - 2] = ' ';
for (i = 0; i < num2; i++)
{
//判断每个单词的长度
//暂时没有想到其他设计可以把每个单词填充到一个字符数组里
int num3 = strlen(ptemp1[i]);
for (j = 0; j < num3; j++)
{
resstr[k] = ptemp1[i][j];
k++;//数组的自增设计--适用与根据内部条件自增
}
resstr[k] = ' ';
k++;
//释放内存
free(ptemp1[i]);
ptemp1[i] = NULL;
}
//释放内存
free(ptemp1);
ptemp1 = NULL;
}
return ERRO_MSG;
}
void main(){
char *english = " i am student , you are teacher ";
char *pstr = (char *)malloc(sizeof(char)*(strlen(english) + 1));
ProtectEnglish(english, pstr);
printf("执行之后的字符串是%s\n", pstr);
free(pstr);
pstr = NULL;
system("pause");
}
![]()