求助,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;
}
输入一个字符串后,删除某个特定字符,然后输出字符串。这个是我自己写的,效果是达到了,可我自己看不懂了,求大神讲解。
...全文
13032 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;
#include "iostream.h" #include "string.h" #include "stdlib.h" int g; //g是接收功能选择的变量 // 加法函数 void out() { cout<<" 程序功能:可以完成任意大数的加法,减法和比较大小"<y?m=x:m=y; ma=m; i=x-1; j=y-1; for(;m>0;i--,j--,m--) { if(j=xx) s=int(a[i])-48+jin; //将字符转换成整型 else if(i=yy) s=int(b[j])-48+jin; else if(i>=xx && j>=yy) s=(int(a[i])-48+int(b[j])-48+jin); if(s>9) { jin=1; c[m]=char(s+38); } else { jin=0; c[m]=char(s+48); } } if(jin==1) c[0]='1'; else c[0]=' '; if(g==1) { cout<<"两数相加的结果为:"; if(f==0) for(i=0;i=0;i--,j--,m--) { if(j=xx) s=int(a[i])-48-jin; else if(i>=xx&&j>=yy) s=(int(a[i])-48)-(int(b[j])-48)-jin; if(s<0) { jin=1; c[m]=char(s+58); } else { jin=0; c[m]=char(s+48); } } if(g==1) { cout<<"两数相加的结果为:"; if(f==0) for(i=0;iy) { if(a[0]=='-') cout<<"数一小于数二"<b[i]) { cout<<"数一小于数二"<b[i]) { cout<<"数一大于数二"<>a; cout<<" 输入第二个大数:"; cin>>b; while(1) { cout<<"(1:加法 2:减法 3:比较 4:乘法 5:除法 6:求余)请选择:"; cin>>g; x=strlen(a); y=strlen(b); if(a[0]=='-' && b[0]=='-' && g==1) { f=1; d=3; add(a,b,x,y,f,d); } if(a[0]!='-' && b[0]!='-' && g==1) { f=0; d=0; add(a,b,x,y,f,d); } if(a[0]=='-' && b[0]!='-' && g==1) { if(x-1>y) { f=1; d=1; jian(a,b,x,y,f,d); } if(x-1==y) { for(int i=0;ib[i]) { f=1; d=1; jian(a,b,x,y,f,d); break; } if(a[i+1]y-1) { f=0; d=2; jian(a,b,x,y,f,d); } if(x==y-1) { for(int i=0;ib[i+1]) { f=0; d=2; jian(a,b,x,y,f,d); break; } if(a[i]y) { f=1; d=1; jian(a,b,x,y,f,d); } if(x==y) { for(int i=1;ib[i]) { f=1; d=1; jian(a,b,x,y,f,d); break; } if(a[i]y) { f=0; d=0; jian(a,b,x,y,f,d); } if(x==y) { for(int i=0;ib[i]) { f=0; d=0; jian(a,b,x,y,f,d); break; } if(a[i]>yn; if(yn!='Y' && yn!='y') break; } }赞同0| 评论 向TA求助 回答者: PFanAya | 四级采纳率:27% 擅长领域: C/C++ 参加的活动: 暂时没有参加的活动 提问者对回答的评价: 谢了 相关内容 2012-2-6 请设计一个有效的算法,可以进行两个n位大整数的乘法运算。 2011-5-31 c语言题目 1.编写两个函数,输入的整数按字符形式逆序输出,要求... 2011-4-21 用c语言表达,输出 思路写两个例子,不要printf("\n").其次:需... 2 2011-4-3 请你设计个算法,在整数边长的直角三角形ABC的斜边c的长度确定的情... 2009-5-14 如何用栈设计个C语言计算器,高手请跟我说说算法,特别是那些括号... 7 更多相关问题>> 查看同主题问题: 整数 乘法 c++ 算法 长度 两个 其他回答 共2条 2010-10-4 09:56 alfredzzj | 三级 网上很多的呀,Google一下。 按照乘法的运算思想就可以,这是每次都将进位缓存起来。 赞同0| 评论 2010-10-5 13:44 陈学阳 | 十二级 感觉这个好~~你可以挨着比较两个字符,需要匹配的可以不去比较,或者是问号的就当成是相等的字符 bool Match(const char* pSrc,const char* pMatch) { while(*pSrc!=0) { if(*pMatch==0) return false; if(*pMatch != '?' && *pSrc != *pMatch) return false; pMatch++; pSrc++; } if(*pMatch!=0) return false; else return true; }

69,371

社区成员

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

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