Q)写一个c程序,输入三个字符串,每个字符串最多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');
}
}
}
}
}
但是当我在代码块中运行代码时,连续的随机字符会发出连续的蜂鸣声,直到我关闭系统。任何人都可以帮我这个吗?
答案 0 :(得分:1)
有一些问题导致了这个问题。
在这里,他们按照我解决的顺序:
(编译时)
x < count1
无效,因为您试图将整数与指针进行比较。对于存在类似比较的其他块,这应该是x < count1[i]
等等。gets()
不安全,建议改为使用gets_s()
或fgets()
。 Here's为什么。(逻辑)
printf("%c",x+'a');
应改为printf("%c", i +'a');
,即在i
添加a
之前,您应该使用i
(而不是x)的字符值,因为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');
}
}
部分是不必要的。所有这些都可以安全删除,代码的最后一部分可以替换为以下内容:(请注意缩进并在整个程序中进行改进)
{{1}}
答案 1 :(得分:1)
您的代码中存在各种错误。
打印常用字符时,循环为:
for (x = 0; x < count1; x++) ...
但是count1
是数组的地址,通常是一个很大的数字。你的循环比你预期的要长;它访问超出count[25]
的内存位置,其中包含随机数据(至少没有你的算法可以理解)并打印它。 (哔哔声来自使用ASCII码7,警报或铃声代码'\a'
打印字符。如果你在MS-DOS上,你也会看到一些快乐的黑白脸。)
正确的循环运行到count1
中存储的字母i
中的字母数。
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
的出现次数。如果你的常用字符是你的,那么这将打印出#34; abc&#34;。您应该打印i + 'a'
。 (这只是一个逻辑错误,不会导致程序崩溃。)