假定输入的字符串中只包含字母和号。请编写函数fun,它的功能是:除了字符串前导的号之外,将串中其他*号全部删除。在编写函数时,不得使用c语言提供的字符串函数。如 * * * A * * BC * * 改为 * * * ABC
#include
void fun(char x[],int y)
{
int j;
for(j=0;jif(*(x+j)!='*')break;//数组中遇到第一个字母就跳出循环
printf("%c",*(x+j));
}
int k;
for(k=j+1;kif(*(x+k)=='*')continue;//第一个字母后面若是*号则直接进入下一次循环
else
{
printf("%c",*(x+k));
}
}
}
int main()
{
int i=0;
char ch;
char a[1000];
while((ch=getchar())!='\n')
{
*(a+i)=ch;
i++;
}
fun(a,i);
return 0;
}
为什么函数fun跳出第一个循环后进入不了第二个循环,输出结果只有前导的几个*号
应该是进入了第二个循环,但是第二个循环的结束条件和初始条件不对,初始条件要改为k=j,因为前一个循环已经让j变成了指向下一个字符位置,然后结束条件要改为k<y,因为是要判断整个字符串,所以结束条件仍然是要下标k小于字符串的长度y,(如果需要改变字符数组,可以看下 注释了的代码),修改如下:
#include<stdio.h>
void fun(char x[],int y)
{
int j;
for(j=0;j<y;j++)
{
if(*(x+j)!='*')break;//数组中遇到第一个字母就跳出循环
printf("%c",*(x+j));
}
int k;
for(k=j;k<y;k++)
{
if(*(x+k)=='*')continue;//第一个字母后面若是*号则直接进入下一次循环
else
{
printf("%c",*(x+k));
}
}
// int j;
// int index=0; //用于记录可存入字符数组x中的字符的下标
// for(j=0;j<y;j++)
// {
//
//
// if(*(x+j)!='*')break;//数组中遇到第一个字母就跳出循环
// // printf("%c",*(x+j));
//
// if(*(x+j)=='*'){
// index++; //前导星号可以保留在字符数组x中,则index下标++
// }
// }
//
//
// int k;
//
// for(k=j;k<y;k++)
// {
// if(*(x+k)=='*')continue;//第一个字母后面若是*号则直接进入下一次循环
// else
// {
// x[index]=*(x+k); //将当前字母存入字符数组相应位置
// index++; //因为当前字符存入了字符数组相应的位置,则计数下标index++
// //printf("%c",*(x+k));
//
// }
//
// }
// x[index]='\0'; //结束复制移动字符后,在结尾加一个字符串结束字符空字符'\0',标志为处理后的字符串。
}
int main()
{
int i=0;
char ch;
char a[1000];
while((ch=getchar())!='\n')
{
*(a+i)=ch;
i++;
}
fun(a,i);
// printf("%s",a); //如果使用改变字符数组的办法,则打印这个改变后的字符数组
return 0;
}