2016-02-28 50 views
-2

我的代碼以隨機順序打印字符的頻率。可以做些什麼,以便按給定單詞的順序打印字符的頻率。我當前的代碼如下所示我希望我的代碼以字符串的出現順序打印字符的頻率

#include <stdio.h> 
#include <conio.h> 

void main() { 
    char string1[50]; 
    int i = 0, counter[26] = { 0 }; 
    printf("\nEnter a string\n"); 
    //Inputs a string 
    gets(string1); 
    while (string1[i] != '\0') { 
     //checks and includes all the characters 
     if (string1[i] >= 'a' && string1[i] <= 'z') { 
      //counts the frequency of characters 
      counter[string1[i] - 'a']++; 
      i++; 
     } 
    } 
    //printing frequency of each character  
    for (i = 0; i < 26; i++) { 
     if (counter[i] != 0) 
      printf("%c occurs %d times.\n", i + 'a', counter[i]); 
    } 
    getch(); 
} 

輸出樣本:

currently getting output

+0

你的問題有點不清楚。您是否說代碼正常工作,除了它跳過字符串中的第一個字符? –

+0

它不會打印字符串中第一個字符的頻率。除此之外,它會打印字符串中的所有字符 –

+3

向我們展示一些樣本輸入,實際輸出和預期輸出。 – dbush

回答

3

有在你的代碼的幾個問題:

  • 使用gets:此功能是不安全的,它是從當前版本的C標準中刪除。
  • 只有在string1[i]爲小寫字母的情況下,您纔會增加i:如果您鍵入任何其他字符,則將運行無限循環。
  • main的正確原型是int main(void)int main(int arc, char *argv[])
  • 你只能算小寫字母。 H是大寫,因此不計算在內。

下面是一個改進版本:

#include <stdio.h> 
#include <ctype.h> 

int main(void) { 
    char string1[128]; 
    int i = 0, counter[256] = { 0 }; 
    printf("\nEnter a string\n"); 
    //Inputs a string 
    if (fgets(string1, sizeof string1, stdin) == NULL) { 
     // empty file: got an empty line 
     *string1 = '\0'; 
    } 
    for (i = 0; string1[i] != '\0'; i++) { 
     if (isalpha((unsigned char)string1[i])) { 
      //counts the frequency of letters 
      counter[string1[i]]++; 
     } 
    } 
    //printing frequency of each counted character 
    //characters are printed in the order of appearance 
    for (i = 0; string1[i] != '\0'; i++) { 
     if (counter[string1[i]] != 0) { 
      printf("%c occurs %d times.\n", 
        string1[i], counter[string1[i]]); 
      counter[string1[i]] = 0; // print each letter once. 
     } 
    } 
    getch(); 
    return 0; 
} 
+0

我更新了代碼以按出現順序打印這些字母,而沒有重複。 – chqrlie

0

通過使用串的第二時間,以產生所述輸出可以得到印刷在他們出現的順序的字符。

在您打印每個字符的頻率的部分中,使用該代碼來處理輸入字符串。這次,如果頻率值不爲零,請打印它,然後將頻率值重置爲零。如果頻率值零,則必須已經打印出來,所以不做任何事情。

//printing frequency of each counted character (in input order) 
for (i = 0; string1[i] != '\0'; i++) { 
    char ch = string[i]; 
    if (counter[ch - 'a'] != 0) { 
     printf("%c occurs %d times.\n", ch, counter[ch - 'a']); 
     counter[ch - 'a'] = 0; 
    } 
} 
相關問題