繁体   English   中英

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

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

但是当我在代码块中运行代码时,连续的随机字符会发出连续的哔哔声,直到我关闭系统。 谁能帮我这个?

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

(编译时间)

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

(逻辑)

  1. printf("%c",x+'a'); 应该是printf("%c", i +'a'); 即你应该采取的字符值i加入之前(不是X) a以它为i是你正在寻找在环路字母的变量保持跟踪。
  2. 如果你只想打印出被重复的(例如ABC)的字母,字符(aabbccc)时,不是顺序ifelse ifelsefor在您最后一节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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM