跪求大佬,字符串中删除一个特定字符
#include<stdio.h>#include<string.h>
void na(char c[]);
main()
{
char s="my name is wang yi han";
na(s);
puts(s);
}
void na(char c[])
{
int b,p,k=0,v;
v=strlen(c);
char s,f;
printf("请输入要删除的字符\n");
scanf("%c",&s);
for(b=0;c!='\0';b++)
{
if(c==s)
{
k=k+1;
for(p=b;c==s;p++)
{
}
f=c;
c=c;
c=f;
}
}
c='\0';
}请问这个程序哪里不对?
删除字符的话只需要找到字符后从后往前覆盖就可以了,你中间把字符交换,其实没有必要 你这个算法的想法是把要删除的字符和后面第一个非删除字符交换
但是有两个问题
第一个, 你没有判断后面一串都是要删除的情况, 这个时候第一个非删除字符是字符串结尾'\0'
你会把当前的要删除字符和字符串结尾交换了, 然后去判断下一个字符了, 这就导致循环无限向后推移,最后内存越界错误
第二个, 举例说明mya 三个字符的字符串,假如要删除m
第一次进来 发现m了k=1, 交换后,字符串是yma
再次进入循环,有一次发现m, k=2,....
再进来 k=3, .....
所以你的k计数器是无效的
修改办法,
for(b=0; c!='\0'; b++)
{
if(c==s)
{
// k = k + 1;
for(p=b;c==s;p++)
{
}
f=c;
c=c;
c=f;
if ( c == '\0') {
k = p - b;
break;
}
}
} 注释掉一行语句
/* */是注释掉一大段语句
// 注释掉一行语句 好好看看代码好不。
看了半天理解你的代码,理解你的思路,沿着你的思路把解决问题了, 然后你还要把自己带沟里去
注释掉k=k+1, 是因为按照你的思路这样计数是无效的,理由前面已经给你解释了
补充上去的那三行代码, 解决了一个问题,就是当你已经把字符串互换到最后的若干个都是要删除的数据的时候,可互换的非要删除字符是字符串的结尾, 而p就是字符串结尾的序号, 所以p-b就是一共有一个要删除的字符串
直接计算得到了结果, 还循环计数个鬼啊
此外,倒数第二行的那个 c = '\0' 那一行在这个修正的代码下也是多余的
因为字符串结尾已经被互换过去了。 复杂化了
定义SRC[]记录处理前的字符串
定义DST[]记录处理后的字符串
然后将不等于要删除的字符,依次copy到dst字符数组里就可以了
页:
[1]