[英]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.