C语言删除字符串中的某个特定字符!

#include<stdio.h>intmain(){chars[100],*p,*q;puts("输入小于100个字符:");gets(s);chardel_x;pri... #include<stdio.h>

int main()

{

char s[100],*p ,*q ;

puts("输入小于100个字符:");

gets(s);

char del_x;

printf("输入要删除的字符:");

scanf("%c",&del_x);

for(p=s,q=s;*p!='\0';p++)

if(*p!=del_x)*q++=*p;
*q=*p;//这是什么意思,是让字符串末尾为\0吗

puts(s);//为啥是输出s呢,s好像并没有变化呀

return 0;

}
展开
 我来答
microroom
科技发烧友

2018-12-01 · 智能家居/数码/手机/智能家电产品都懂点
知道大有可为答主
回答量:7118
采纳率:83%
帮助的人:1642万
展开全部
*q=*p;是让字符串末尾为'\0'。

当然是输出s。
分析一下:
q用来指向s中下一个插入位置,p用来遍历s的各字符。开始q和p都指向s的第一个字符。

如果p指向的字符不是要删除的字符,就将它赋给q指向的字符,并使q指向下一个位置,这是通过*q++=*p;实现的;如果p指向的字符是要删除的字符,跳过它,不将它复制给q指向的位置。接着令p指向下一个字符(无论是否执行了*q++=*p;语句)。for结束后p指向'\0',q指向的字符前面是删除了del_x后剩下的字符,最后执行*q=*p;令字符串末尾为'\0'。
追答

1259049661
2018-12-01 · TA获得超过1552个赞
知道小有建树答主
回答量:333
采纳率:88%
帮助的人:214万
展开全部
题主的注释是正确的。
首先,p q都指向s指向的数组。你可以完全把p q当成s一样的东西,只不过*q *p是可以变化的。
p作为循环判断,只要p不空就继续循环。p不为要删除的字符,就将p目前指向的字符赋值到q。
如:
s: 12345
del_x: 3
首先,q[0] = p[0] = 1; q++;其实是s[0] = s[0]
然后q[1] = 2; q++;s[1] = s[1],其实在遇到要删除的字符前赋值并没有意义,只需要q++就行
q[2] = 4,从这里开始,因为已经删除了3,所以q必须开始变化,所以需要使用q[2] = p[3],就是s[2] = s[3]
最后循环结束的q:12455,而*p = '\0',所以把q最后一位赋值成\0。
追问
为啥第二次循环的时候 输入sasasa a 输出ss 第一个s不见了 咋回事啊
追答
我理解好像是你的scanf("%c",&del_x);没有读取到你的输入。明天白天再看看。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
邶鸿宝绍柳
2019-01-07 · TA获得超过3.1万个赞
知道大有可为答主
回答量:1.2万
采纳率:35%
帮助的人:923万
展开全部
这个容易,就是把指定位置的字符去掉,也就是说后面的字符覆盖
比如删除指定的字符在字符串中第一个出现的位置
void
strdel(
char*
str,
char
ch
)
{
char
*p
=
str;
while(
*p
)
{
if(
*p==ch
)
break;
}
if(
*p
)
{
while(
*p
)
{
*p==*(p+1);
p++;
}
}
}
希望能解决您的问题。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
遗失的迷惘O
2018-12-01 · TA获得超过477个赞
知道小有建树答主
回答量:382
采纳率:77%
帮助的人:100万
展开全部
这个看着没有问题呀。
那句的意思就是把最后的\0也复制过来
追问
为啥第二次循环的时候 输入sasasa a 输出ss 第一个s不见了 咋回事啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式