例如,字符串中的内容为:****A*BC*DEF*G******,删除后,字符串中的内容应当是:****ABCDEFG。
一、理解分别删除前、中、后三个部分的*
三个部分的思想相似:先定位*在数组中的位置,然后依次赋值数组来达到删除*的目的
(1)删除前导*
#include<stdio.h>
void main()//删除前导*
{
char s[50];
int i =0,j =0;
printf("请输入一个只包含字母和*号的字符串:\n");
gets(s);
for(i =0;s[i] == '*';i++);//定位
for(j = 0;s[i];i++,j++)//移位
s[j] = s[i];//删除
s[j] ='\0';//要以%s打印就需要手动添加,以达到字符串结束的目的
puts(s);
}
(2)删除中间*
#include<stdio.h>
void main()//删除中间*
{
char s[50];
int i = 0, j = 0;
printf("请输入一个只包含字母和*号的字符串:\n");
gets(s);
for (i = 0; s[i]; i++)//s[i]和s[i] != '\0'的效果一样,起对for循环限制的作用
{
if (s[i] == '*' && s[i + 1] != '*' && s[i - 1] != '*');//定位
else
s[j++] = s[i];//删除
}
s[j] = '\0';
puts(s);
}
(3)删除后导*
#include<stdio.h>
void main()//删除尾随*
{
char s[50];
int i = 0,j =0;
printf("请输入一个只包含字母和*号的字符串:\n");
gets(s);
for(i =0;s[i];i++);//测试字符串长度
for(j = i-1;s[j] == '*';j--);//定位 //字符串最后会自动添一个'\0',求出来的i就会比数组多一个元素,所以j初始值为i - 1,且j自减
s[j+1] = '\0';//删除
puts(s);
}
通过以上两个步骤我们分别删除了前、中、后三个部分的*,接下来只要控制条件保留前导部分的*不变,删除中间的以及后导部分的*就可以达到本体的目标
二、删除中间、后导
#include<stdio.h>
void main()
{
char s[50];
int i = 0, j = 0, k =0 ;
printf("请输入一个只包含字母和*号的字符串:\n");
gets(s);
for (i = 0; s[i]; i++);//测试字符串长度
for (j = i - 1; s[j] == '*'; j--);//定位
s[j+1] = '\0';//删除后面的*
for (j = 0; s[j]; j++)
{
if (s[j] == '*' && s[j + 1] != '*' && s[j - 1] != '*');
else
s[k++] = s[j];
}
s[k] = '\0';
puts(s);
}
将删除了后导*的 s[i] 数组赋值给 s[j],再将删除了中间* 的 s[j]数组赋值给 s[k]。
以此达到了题目的要求!!!