帮我看下这个程序的错误

juelang12 2009-11-05 11:47:31
//编写程序,将字符串s1中所有出现在字符串s2中的字符删去
//麻烦高手帮我看哈这个程序的逻辑错误,按照我下边的提示输入字符串s1和s2,帮我找出逻辑错误并改正哈
#include<stdio.h>
#include<string.h>
void main()
{
char s1[10],s2[10];
int i,j,k,lengths1,lengths2;
printf("请输入s1,s2\n");
gets(s1);// 请输入a
gets(s2);//请输入aaaaa
// printf("%d\t%d\n",strlen(s1),strlen(s2));
//}

lengths1=strlen(s1);
lengths2=strlen(s2);
for(i=0;i<lengths1;i++)
for(j=0;j<lengths2;j++)
if(s1[i]==s2[j])
{ for(k=j;k<lengths2;k++)
s2[k]=s2[k+1];
}

printf("%s\n",s2);
}


...全文
161 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
juelang12 2009-11-08
  • 打赏
  • 举报
回复
//编写程序,将字符串s1中所有出现在字符串s2中的字符删去
//思路: 用s2中的每个字符和s1中的每个字符比较,相同的赋予字符'0',
#define M 10
#define N 10
#include<stdio.h>
#include<string.h>
void main()
{
char s1[M],s2[N];
int i,j,k,lengths2,lengths1;
printf("请输入s1,s2\n");
gets(s1);
gets(s2);
lengths2=strlen(s2);
lengths1=strlen(s2);
k=lengths2;

for(j=0;j<lengths2;j++)
for(i=0;i<lengths1;i++)
if(s2[j]==s1[i])
{s2[j]='0';//给s2中要删除的值赋予字符'0'
k--;//k为要保留的值的数目
}
printf("输出执行程序后的数组s2\n");

for(j=0;j<lengths2;j++)
if(s2[j]!='0')
printf("%c",s2[j]);
printf("\n");
// printf("%s\t%d\n",s2,k);

}


这是我从新想的一种算法,不过好像有点么达到要求,呵呵,原题要求删除s2中与s1相同的字符,我只是
做到了不显示s2中与s1中的相同点字符,呵呵

#5楼 当输入s1为a,
s2为aaaaa时,你的程序会出错,你的程序还是有逻辑错误,
#6楼 你太搞笑了,不过你写的挺长的,但是你的程序有很大的问题,语法错误我就不说了,当你的s1长度小于s2时,你直接输出false,当s2的长度大于s1时,你的程序内存无法读取
呵呵,不过既然你要求给你几分,那就给你几分吧
呵呵
谢谢大家的讨论
liangyonglou 2009-11-07
  • 打赏
  • 举报
回复
及时调整字符串长度
zhaixingchen 2009-11-07
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
void main()
{
char s1[10],s2[10];
int i,j,k,lengths1,lengths2;
printf("请输入s1,s2\n");
gets(s1);
gets(s2);
lengths1=strlen(s1);
lengths2=strlen(s2);
for(i=0;i <lengths1;i++)
{
for(j=0;j <lengths2;j++)
{
if(s1[i]==s2[j])
{
for(k=j;k <lengths2;k++)
{
s2[k]=s2[k+1];

}
lengths2--;
}
}
}

printf("%s\n",s2);
}
这样可以了
  • 打赏
  • 举报
回复
#include <stdio.h> 
#include <string.h>
#define FALSE 0
#define SUCCESS 1
int main()
{
char s1[10],s2[10];
int i,lengths2;
printf("请输入s1,s2\n");
gets(s1);// 请输入a
gets(s2);//请输入aaaaa
// printf("%d\t%d\n",strlen(s1),strlen(s2));
//}
lengths2=strlen(s2);
if (strlen(s1)<lengths2) //先做界限判定
{
puts("不存在");
return FALSE;
}
for(i=0;i <=(strlen(s1) -lengths2);i++) // 遍历s1
{
int iTmp;

if (s1[i]==s2[0]) //若第一个字符相同
{
for ( iTmp=1;iTmp<lengths2;iTmp++) //再继续判定其余位置是否相同
{
if (s1[i+iTmp]!=s2[iTmp])
{
break;
}
}
if (iTmp==lengths2) // 如果相同删掉字符串
{
int lengths1=strlen(s1);
for (iTmp=0;iTmp<=lengths1-i-lengths2 ;iTmp++) //删除实现代码,用后面的覆盖前面的
{
s1[i+iTmp]=s1[i+iTmp+lengths2];
}

}

}
}
puts(s1);
return SUCCESS;
}
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
#define FALSE 0
#define SUCCESS 1
int main()
{
char s1[10],s2[10];
int i,lengths2;
printf("请输入s1,s2\n");
gets(s1);// 请输入a
gets(s2);//请输入aaaaa
// printf("%d\t%d\n",strlen(s1),strlen(s2));
//}
lengths2=strlen(s2);
if (strlen(s1)<lengths2) //先做界限判定
{
puts("不存在");
return FALSE;
}
for(i=0;i <=(strlen(s1) -lengths2);i++) // 遍历s1
{
int iTmp;

if (s1[i]==s2[0]) //若第一个字符相同
{
for ( iTmp=1;iTmp<lengths2;iTmp++) //再继续判定其余位置是否相同
{
if (s1[i+iTmp]!=s2[iTmp])
{
break;
}
}
if (iTmp==lengths2) // 如果相同删掉字符串
{
int lengths1=strlen(s1);
for (iTmp=0;iTmp<=lengths1-i-lengths2 ;iTmp++) //删除实现代码,用后面的覆盖前面的
{
s1[i+iTmp]=s1[i+iTmp+lengths2];
}

}

}
}
puts(s1);
return SUCCESS;
}

可能还有一些小问题,不过结果是一样的。如果过得去,还是给点分嘛
juelang12 2009-11-07
  • 打赏
  • 举报
回复
#1楼 这个程序有错,要是么错的话我就不用发到网上了
#2楼 我后来也发现了应该调节字符串的长度,但是还应该调节k的值,否则会漏掉该删掉的字符,你改动的代码还是有问题,还是会出错
#3楼
for(k=j;k <lengths2-1;k++)
s2[k]=s2[k+1];

不过这段代码是将s2中的相同字符删除,LZ是这个意思不?
我就是这个意思,不过你的改动好像也还是有问题,谢谢大家帮忙
无米之炊 2009-11-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 juelang12 的回复:]
//编写程序,将字符串s1中所有出现在字符串s2中的字符删去
//麻烦高手帮我看哈这个程序的逻辑错误,按照我下边的提示输入字符串s1和s2,帮我找出逻辑错误并改正哈
#include <stdio.h>
#include <string.h>
void main()
{
char s1[10],s2[10];
int i,j,k,lengths1,lengths2;
printf("请输入s1,s2\n");
gets(s1);// 请输入a
gets(s2);//请输入aaaaa
// printf("%d\t%d\n",strlen(s1),strlen(s2));
//}

  lengths1=strlen(s1);
    lengths2=strlen(s2);
for(i=0;i <lengths1;i++)
for(j=0;j <lengths2;j++)
if(s1[i]==s2[j])
{ for(k=j;k <lengths2;k++)
      s2[k]=s2[k+1];
}

printf("%s\n",s2);
}
[/Quote]
for(k=j;k <lengths2;k++)
s2[k]=s2[k+1];
s2[--length2] = 0x00; //及时调整字符串长度
昵称很不好取 2009-11-06
  • 打赏
  • 举报
回复
你程序没错,运行正常
#include <stdio.h> 
#include <string.h>

int main(){
char s1[10],s2[10];
int i,j,k,lengths1,lengths2;

printf("请输入s1,s2: \n");
gets(s1);
gets(s2);

lengths1=strlen(s1);
lengths2=strlen(s2);
for(i=0; i<lengths1; i++)
for(j=0; j<lengths2; j++)
if(s1[i]==s2[j]){
for(k=j;k<lengths2;k++)
s2[k]=s2[k+1];
}

printf("%s\n",s2);

return 0;
}
selooloo 2009-11-06
  • 打赏
  • 举报
回复
for(k=j;k <lengths2-1;k++)
s2[k]=s2[k+1];

不过这段代码是将s2中的相同字符删除,LZ是这个意思不?

69,373

社区成员

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

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