打印三个字符串中的常用字符

时间:2014-05-18 06:59:14

标签: c

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');
                }
            }
        }
    }
}

但是当我在代码块中运行代码时,连续的随机字符会发出连续的蜂鸣声,直到我关闭系统。任何人都可以帮我这个吗?

2 个答案:

答案 0 :(得分:1)

有一些问题导致了这个问题。
在这里,他们按照我解决的顺序:

(编译时)

  1. 正如M Oehm在评论中提到的,x < count1无效,因为您试图将整数与指针进行比较。对于存在类似比较的其他块,这应该是x < count1[i]等等。
  2. gets()不安全,建议改为使用gets_s()fgets()Here's为什么。
  3. (逻辑)

    1. printf("%c",x+'a');应改为printf("%c", i +'a');,即在i添加a之前,您应该使用i(而不是x)的字符值,因为if是变量跟踪你在那个循环中看到的字母。
    2. 如果您只想打印出重复的字母(例如 abc ),而不是字符序列( aabbccc ),else if,最终else循环中的forfor(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'); } } 部分是不必要的。所有这些都可以安全删除,代码的最后一部分可以替换为以下内容:
    3. (请注意缩进并在整个程序中进行改进)

      {{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'。 (这只是一个逻辑错误,不会导致程序崩溃。)