簡體   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