一道C语言编程题,麻烦大家帮我看看问题出在哪里?
编写程序:从键盘输入两个字符串,找出其中没有同时出现在两个字符串中的字符。例如:输入串1:abca串2:bcd输出:ad这是我的程序:#include<stdio.h>#...
编写程序:从键盘输入两个字符串,找出其中没有同时出现在两个字符串中的字符。
例如:输入串1:abca 串2:bcd
输出:ad
这是我的程序:
#include<stdio.h>
#include<string.h>
int main()
{
static char s1[100],s2[100];
int i,j,k=1;
gets(s1);
gets(s2);
strcat(s1,s2);
for(i=0;i<strlen(s1);i++)
{
for(j=i+1;j<=strlen(s1)-i-1;j++)
{
if(s1[j]=='*') continue;
if(s1[i]!=s1[j])
{
k=0;
continue;
}
else
{
s1[j]='*';
k=1;
break;
}
}
if(k==0) printf("%c",s1[i]);
}
if(s1[strlen(s1)-1]!='*') printf("%c",s1[strlen(s1)-1]);
printf("\n");
}
这个程序要求数字和字母都可以输出的。我的这个程序当字符串很短的时候是对的,多了就不对了。请问问题出在哪里了呢? 展开
例如:输入串1:abca 串2:bcd
输出:ad
这是我的程序:
#include<stdio.h>
#include<string.h>
int main()
{
static char s1[100],s2[100];
int i,j,k=1;
gets(s1);
gets(s2);
strcat(s1,s2);
for(i=0;i<strlen(s1);i++)
{
for(j=i+1;j<=strlen(s1)-i-1;j++)
{
if(s1[j]=='*') continue;
if(s1[i]!=s1[j])
{
k=0;
continue;
}
else
{
s1[j]='*';
k=1;
break;
}
}
if(k==0) printf("%c",s1[i]);
}
if(s1[strlen(s1)-1]!='*') printf("%c",s1[strlen(s1)-1]);
printf("\n");
}
这个程序要求数字和字母都可以输出的。我的这个程序当字符串很短的时候是对的,多了就不对了。请问问题出在哪里了呢? 展开
展开全部
字符串很长的时候出错,估计时是字符串的长度超过了s1的大小,可以看看strcat函数的具体意义。从给出的程序看,要做很多循环,时间复杂度比较高,下面给出了遍历这两个字符串,就能找到不同的字符的方法,时间复杂度是O(n),可以作为参考。
可以使用哈希表存储字符出现的位置,然后比较两个哈希表,如果不一样,那么就是只在一个字符串中出现。代码如下:
#include<stdio.h>
#include<string.h>
char HashTable1[256];
char HashTable2[256];
int main()
{
static char s1[100],s2[100];
int i,j,k=1;
gets(s1);
gets(s2);
for (i = 0;i<strlen(s1);++i)
{
HashTable1[s1[i]] |= 1;
}
for (i = 0;i<strlen(s2);++i)
{
HashTable2[s2[i]] |= 1;
}
for (int i = 0;i<256;++i)
{
if (HashTable1[i] != HashTable2[i])
{
printf("%c",i);
}
}
printf("\n");
}
代码附件中也有。运行结果如下:
展开全部
整个程序的思路就是错的,短对仅仅是运气好而已。给你程序,没有调试过,你自己试试吧
int main()
{
char s1[100] = {0},s2[100] = {0};
int i = 0, j = 0, k = 0; //k用于记录是否为s1中重复出现
gets(s1);
gets(s2);
for(; i < strlen(s1); ++i)
{
if(k & (1 << s1[i]))
{
continue;
}
else
{
k |= (1 << s1[i]);
}
for(j = 0; j < strlen(s2); ++j)
{
if(s1[i] == s2[j])
{
//相同的字符
break;
}
}
if(j == strlen(s2))
{
//找到不同时出现的字符,如果处理你自己看着办。
}
}
return 0;
}
int main()
{
char s1[100] = {0},s2[100] = {0};
int i = 0, j = 0, k = 0; //k用于记录是否为s1中重复出现
gets(s1);
gets(s2);
for(; i < strlen(s1); ++i)
{
if(k & (1 << s1[i]))
{
continue;
}
else
{
k |= (1 << s1[i]);
}
for(j = 0; j < strlen(s2); ++j)
{
if(s1[i] == s2[j])
{
//相同的字符
break;
}
}
if(j == strlen(s2))
{
//找到不同时出现的字符,如果处理你自己看着办。
}
}
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询