求助,C语言输入一个字符串,然后删除某个字符,再输出字符串

算球? 2015-12-17 12:24:43
#include<stdio.h>
int main()
{
char a[100],ch,i,j,k,count;
gets(a);
scanf(" %c",&ch);
for(i=0;a[i];++i)
{
count=0;
for(j=i;a[j];j++)
{
if(a[j]==ch)
{
k=0;
count++;
}
else
k=1;
if(k==1)
a[j-count]=a[j];
}
a[j-count]='\0';
}
puts(a);
return 0;
}
输入一个字符串后,删除某个特定字符,然后输出字符串。这个是我自己写的,效果是达到了,可我自己看不懂了,求大神讲解。
...全文
13040 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_30864029 2015-12-18
  • 打赏
  • 举报
回复
引用 9 楼 _郭的回复:
[quote=引用 8 楼 qq_30864029 的回复:] [quote=引用 3 楼 _郭的回复:]我发现3个问题。。 1. 我忘记复制最后的“}” 了 2. 我看到你的名字叫永恒郭。。 3. 我大概看了下你的代码,for循环的逻辑表达式 a[i]和a[j]你想要的是什么效果,最后要删除的字符你为什么用/0,如果这个字符在字符串中间,那后面的字符串不要了吗,如果你一定要修改的话,可以改为0,然后输出的时候判断是否为0就可以了。
1,这个没关系。2,把名字和姓倒过来就是我名字了。3,我在第一个循环的最后加上等于’\0’是因为如果要删除的特殊字符串出现在最后,我的那个内部的循环去不掉这几个字符。如:abcds!!!,这样的话,我的内部循环就只能计算出!的个数而去除不掉!,这就需要最后的那个=’\0’来把第一个!改成\0,让字符串就此结束。。。。谢谢你的回答[/quote] 昨天之前我显示的名字也是和你一样倒着写的。我觉得你把这个程序复杂化了,而且我觉得自己写的每一句代码都要清楚它存在的意义,不然可能就会出现自己的代码自己看不懂的情况。我也是初学者,共同学习![/quote] 嗯,和七楼说的一样,外边那个循环跟本就用不到,浪费了。
_郭 2015-12-17
  • 打赏
  • 举报
回复
自己写的自己都看不懂。。。你还是先找一下这个问题的原因吧,在我学习的这段时间还没有出现过自己写的代码自己看不懂的情况。。
庄鱼 2015-12-17
  • 打赏
  • 举报
回复
外层for如用于顺序读字符串内容,内层for用于计数并删除相同的字符。外层for没什么用,这种重复纯属浪费,在a[j-count]='\0';后添加
i=j-count;
break;终止for循环跳出;
char *StrDelCh(char *s,char c) {
  char *p=s,*q=s;
  for(;*p;p++)
    if(*p != c )
      q==p ? q++ : *q++ = *p;
  *q = '\0';
  return s;
}
qq_30864029 2015-12-17
  • 打赏
  • 举报
回复
引用 3 楼 _郭的回复:
我发现3个问题。。
1. 我忘记复制最后的“}” 了
2. 我看到你的名字叫永恒郭。。
3. 我大概看了下你的代码,for循环的逻辑表达式 a[i]和a[j]你想要的是什么效果,最后要删除的字符你为什么用/0,如果这个字符在字符串中间,那后面的字符串不要了吗,如果你一定要修改的话,可以改为0,然后输出的时候判断是否为0就可以了。
1,这个没关系。2,把名字和姓倒过来就是我名字了。3,我在第一个循环的最后加上等于’\0’是因为如果要删除的特殊字符串出现在最后,我的那个内部的循环去不掉这几个字符。如:abcds!!!,这样的话,我的内部循环就只能计算出!的个数而去除不掉!,这就需要最后的那个=’\0’来把第一个!改成\0,让字符串就此结束。。。。谢谢你的回答
qq_30864029 2015-12-17
  • 打赏
  • 举报
回复
引用 1 楼 _郭的回复:
自己写的自己都看不懂。。。你还是先找一下这个问题的原因吧,在我学习的这段时间还没有出现过自己写的代码自己看不懂的情况。。
看的时候漏了一个条件,现在看懂了
qq_30864029 2015-12-17
  • 打赏
  • 举报
回复
引用 4 楼 fly_dragon_fly的回复:
你的代码就是从后往前拷了, 只是奇怪自己写的怎么看不懂
看的时候漏了一个条件,现在看懂了。
fly_dragon_fly 2015-12-17
  • 打赏
  • 举报
回复
你的代码就是从后往前拷了, 只是奇怪自己写的怎么看不懂
_郭 2015-12-17
  • 打赏
  • 举报
回复
引用 8 楼 qq_30864029 的回复:
[quote=引用 3 楼 _郭的回复:]我发现3个问题。。 1. 我忘记复制最后的“}” 了 2. 我看到你的名字叫永恒郭。。 3. 我大概看了下你的代码,for循环的逻辑表达式 a[i]和a[j]你想要的是什么效果,最后要删除的字符你为什么用/0,如果这个字符在字符串中间,那后面的字符串不要了吗,如果你一定要修改的话,可以改为0,然后输出的时候判断是否为0就可以了。
1,这个没关系。2,把名字和姓倒过来就是我名字了。3,我在第一个循环的最后加上等于’\0’是因为如果要删除的特殊字符串出现在最后,我的那个内部的循环去不掉这几个字符。如:abcds!!!,这样的话,我的内部循环就只能计算出!的个数而去除不掉!,这就需要最后的那个=’\0’来把第一个!改成\0,让字符串就此结束。。。。谢谢你的回答[/quote] 昨天之前我显示的名字也是和你一样倒着写的。我觉得你把这个程序复杂化了,而且我觉得自己写的每一句代码都要清楚它存在的意义,不然可能就会出现自己的代码自己看不懂的情况。我也是初学者,共同学习!
_郭 2015-12-17
  • 打赏
  • 举报
回复
我发现3个问题。。
1. 我忘记复制最后的“}” 了
2. 我看到你的名字叫永恒郭。。
3. 我大概看了下你的代码,for循环的逻辑表达式 a[i]和a[j]你想要的是什么效果,最后要删除的字符你为什么用/0,如果这个字符在字符串中间,那后面的字符串不要了吗,如果你一定要修改的话,可以改为0,然后输出的时候判断是否为0就可以了。
_郭 2015-12-17
  • 打赏
  • 举报
回复
我改了一下你的一下代码,但我没有对字符串进行删除,只是在输出的时候增加了一个筛选
#include <stdio.h>
#include <windows.h>
int main()
{
	char a[100] = {0};
	char ch = 0;
	scanf("%s",a);
	fflush(stdin); //清空缓冲区
	printf("请输入要删除的字符:");
	scanf(" %c", &ch);
	for (int i = 0; i < 100; i++)
	{
		
		if (a[i] != ch && a[i] != 0)
			putchar(a[i]);
	}
	system("pause");
	return 0;

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧