程序中,规定输入的字符串中只包含字母和*号。编写函数fum,其功能是:将字符串中的前导*号全部删除,中间和尾部的*号不删除。
例如,字符串中的内容为"*****A*BC*DEF****", 删除后字符串中的内容应当是 :"A*BC*DEF****"
程序中,规定输入的字符串中只包含字母和*号。编写函数fum,其功能是:将字符串中的尾导*号全部删除,中间和前部的*号不删除。
例如,字符串中的内容为"*****A*BC*DEF****", 删除后字符串中的内容应当是 :"*****A*BC*DEF"
诸如此类的题大家见的应该不少,那么其实这种题的思路有很多的,这里介绍简单的一种
删除前导*号
我们先来看第一种,删除前导*号,其他不删除,分为两步
- 找到前导的开始位置和结束位置
- 删除前导,保留其他
找到位置并不难以实现,那么删除,在C语言中,应该如何体现呢?
其实C语言中最常用的数组删除法就是拿另一个变量遍历数组,通过改变下标的值来改变数组元素
举个栗子
char str[] = "*****A*BC*DEF****";
int j = 0;
for (int i = 0; str[i]; i++)
{
if (str[i]=='*')
{
str[j++] = str[i];
}
}
str[j] = '\0';//为了输出时不输出乱码,手动放一个\0作为字符串结束标志.
这样就实现了一个筛选操作,筛选这个字符串中的所有*号.这也就是一种删除了
那么其实前导删除也没有多大区别,接下来是代码
void del_FrontStar(char* str)
{
int start = 0, index = 0;
while (str[start] == '*')
{
start++;
}
while (str[start])
{
str[index] = str[start];
start++;
index++;
}
str[index] = '\0';
}
删除尾导*号
那么前导完了,尾导其实也差不多.只不过这里需要从后往前遍历.
void del_RearStar(char* str)
{
int end = strlen(str) - 1;
int index = 0;
while (str[end]=='*')
{
end--;
}
for (int i = 0; i <= end; i++)
{
str[index++] = str[i];
}
str[index] = '\0';
}
注意:这里i<=end是因为end在上面循环完后应该处于一个字母的下标位置,不能不遍历到它
删除中间*号
删除中间其实就需要从重新指定头和尾的位置,在此例中就是A前面是头,F后面是尾,那么其实就是我们前面删除前导和尾导的位置.
void del_CenterStar(char* str)
{
int start = 0;
int end = strlen(str) - 1;
int index = 0;
while (str[start]=='*')
{
start++;
}
while (str[end]=='*')
{
end--;
}
for (int i = start; i <= end; i++)
{
if(str[i]!='*')
{
str[index++] = str[i];
}
}
str[index] = '\0';
}
给定尾导*号的个数,将多余的删除
那么其实就是做一个判断,如果多余给定的个数,那么就删除到只剩给定个数数量的*号
void del_RearSpareStar(char* str,int n)
{
int end = strlen(str) - 1;
int count = 0;
int index = 0;
int delNum = n;
while (str[end]=='*')
{
count++;
end--;
}
index = end + 1;
if (count > n)
{
for (int i = index; delNum!=0; i++)
{
str[index++] = str[i];
delNum--;
}
}
str[index] = '\0';
}