[英]printing common characters in three strings
Q)编写交流程序,输入三个字符串,每个字符串最多30个字符,并打印所有三个字符串中的常用字符。 每个字符串可以具有不同数量的字符。
我写的代码是:
#include<stdio.h>
int main()
{
int c1=0 , c2=0, c3=0 ,i,x;
int count1[26]={0} , count2[26]={0} , count3[26]={0};
char st1[30],st2[30],st3[30];
printf("enter string1: ");
gets(st1);
printf("\n enter string2: ");
gets(st2);
printf("\n enter string3: ");
gets(st3);
while(st1[c1]!='\0')
{
count1[st1[c1]-'a']++;
c1++;
}
while(st2[c2]!='\0')
{
count2[st2[c2]-'a']++;
c2++;
}
while(st3[c3]!='\0')
{
count3[st3[c3]-'a']++;
c3++;
}
for(i=0;i<26;i++)
{
if(count1[i]!=0 && count2[i]!=0 && count3[i]!=0)
{
if (count1[i]<count2[i] && count1[i]<count3[i])
{
for(x=0;x<count1;x++)
{
printf("\n %c ",x+'a');
}
}
else if(count2[i]< count1[i] && count2[i]< count3[i])
{
for(x=0;x<count2;x++)
{
printf("%c",x+'a');
}
}
else
{
for(x=0;x<count3;x++)
{
printf("%c",x+'a');
}
}
}
}
}
但是当我在代码块中运行代码时,连续的随机字符会发出连续的哔哔声,直到我关闭系统。 谁能帮我这个?
有一些问题导致了这个问题。
在这里,他们按我解决的顺序:
(编译时间)
x < count1
无效,因为您试图将整数与指针进行比较。 对于存在类似比较的其他块,这应该是x < count1[i]
等等。 gets()
是不安全的,建议使用gets_s()
或fgets()
。 这就是原因。 (逻辑)
printf("%c",x+'a');
应该是printf("%c", i +'a');
即你应该采取的字符值i
加入之前(不是X) a
以它为i
是你正在寻找在环路字母的变量保持跟踪。 if
, else if
, else
并for
在您最后一节for(i=0;i<26;i++)
循环是不必要的。 所有这些都可以安全删除,代码的最后一部分可以替换为以下内容: (请注意缩进并在整个程序中进行改进)
for(int i=0; i<26; i++)
{
if(count1[i]!=0 && count2[i]!=0 && count3[i]!=0)
{
printf("%c", i+'a');
}
}
您的代码中存在各种错误。
当您打印常用字符时,您的循环是:
for (x = 0; x < count1; x++) ...
但count1
是你的数组的地址,通常是一个很大的数字。 你的循环比你预期的要长; 它访问超出count[25]
内存位置,其中包含随机数据(至少没有你的算法可以理解)并打印它。 (哔哔声来自打印字符的ASCII码7,警报或铃声代码'\\a'
。如果你在MS-DOS上,你也会看到一些快乐的黑白脸。)
正确的循环运行到字母i
count1
存储的字母数。
for (x = 0; x < count1[i]; x++) ...
当你计算字母时,你会增加
count1[st1[c1] - 'a']++;
当st1[c1] - 'a'
不在0到25的范围内时,这将引起可怕的未定义行为 。这很容易发生,例如,如果你的字符串是"New York"
。 您需要检查字符是否在正确的范围内,或者您需要将解决方案扩展到所有字符。 (注意,作业谈论的是字符,而不是字母。)
打印常用字符时,不能正确打印它们:
printf("%c", x + 'a');
这里, x
从0开始运行到字母i
的出现次数。 如果你的常用字符是你的,那么这将打印“abc”。 你应该打印i + 'a'
。 (这只是一个逻辑错误,不会导致程序崩溃。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.