字符串只包含字母和*号删除*号的的各种题型

程序中,规定输入的字符串中只包含字母和*号。编写函数fum,其功能是:将字符串中的前导*号全部删除,中间和尾部的*号不删除。
例如,字符串中的内容为"*****A*BC*DEF****", 删除后字符串中的内容应当是 :"A*BC*DEF****"
程序中,规定输入的字符串中只包含字母和*号。编写函数fum,其功能是:将字符串中的尾导*号全部删除,中间和前部的*号不删除。
例如,字符串中的内容为"*****A*BC*DEF****", 删除后字符串中的内容应当是 :"*****A*BC*DEF"

诸如此类的题大家见的应该不少,那么其实这种题的思路有很多的,这里介绍简单的一种

删除前导*号

我们先来看第一种,删除前导*号,其他不删除,分为两步

  1. 找到前导的开始位置和结束位置
  2. 删除前导,保留其他

找到位置并不难以实现,那么删除,在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';
}

上一篇:vue使用elementui框架,导出table表格为excel格式


下一篇:常见的文件后缀名