2017-04-11 47 views
0

我需要我的程序輸入用戶想要輸入的句子數,然後輸入這些句子。然後,通過傳遞函數letter(),我想讓它計算每個字母在字符串中出現的次數。不過,我遇到了以下問題:計算一個句子的字母給出隨機輸出

  1. 當我輸入的行數,該程序只要求用戶輸入1小於輸入的號碼(即,如果我想2句,我只提示一)。
  2. 字母計數無法正常工作。這似乎是一種隨機的。

另外我想知道我是否正確使用我的二維數組(即我是否正確填充它,是否正確地將它傳遞給函數)。對於數組str[][],我希望第一個框表示句子數,第二個表示每行中的字符數。

這裏是我的代碼:

#include <stdio.h> 

void letter(int n, char str[][80]){ 
    char c = 'a'; 
    char alpha[26]; 
    int ltrcnt[26]; 

    for(int i = 0; i < 26; i++){ 
     ltrcnt[i] = 0; 
    } 

    for(int i = 0; i < 26; i++){ 
     for(int j = 0; j < 26; j++){ 
      for(int k = 0; k < 26; k++){ 
       if(str[i][j] == c){ 
        ltrcnt[k]++; 
       } 
       c++; 
      } 
     } 
    } 

    c = 'a'; 
    for(int i = 0; i < 26; i++){ 
     printf("%c: %d\n", c, ltrcnt[i]); 
     c++; 
    } 
} 

int main(void){ 
    int n; 

    printf("Enter number of lines: "); 
    scanf("%d", &n); 

    char str[n][80]; 
    printf("Enter a sentecne: "); 
    for(int i = 0; i < n; i++){ 
     fgets(str[i], 80, stdin); 
    } 

    letter(n, str); 
} 
+0

隨機你的意思是你可以進入同一個句子兩次,你會得到不同的結果如何? –

回答

3

第一個問題fgets()跳過一個迭代是因爲的按剩餘newline的輸入第一個輸入後關鍵。

一個簡單的例子來清理輸入緩衝器關閉換行符將

scanf("%d%*c", &n); //eat the newline. 

對於第二個問題,功能裏面,你有三個嵌套循環這沒有任何意義。您在任何地方都沒有使用n的值。這沒有任何意義,並導致垃圾輸出。

例如,

  • 你限制指數j25,但實際上你要接受它是隻要79
  • 你有循環變量k,這是不正確使用。

明智的循環條件是,

  • i高達n-1i<n)作爲第一個指數。
  • j高達終止空,(arr[i][j]
  • k,從a開始,直到zint k = 'a'; k < ('z' + 1) ; k++)[注:此計算僅小寫字母]
+0

@BLUEPIXY加入回答,謝謝。 :) –

+1

在這種情況下'ltrcnt [k] ++;' - >'ltrcnt [k -'a'] ++;' – BLUEPIXY

1

當我輸入行數,程序只要求用戶輸入1比輸入的數字少1

我猜你在做scanf時,它不會號碼末尾不要吞下新線。因此,第一個fgets獲得該行上剩餘的(空)數字

字母計數無法正常工作。這似乎是一種隨機的。

在你的循環,i應該算從0n - 1(即str行數)和j應該從0數到strlen(str[i]) - 1或更好,j應該從0數到時str[i][j] == '\0'因爲strlen需要遍歷通過所有的角色本身,因此效率低下。然後

你的內循環應該看到,如果str[i][j]azAZ之間,如果是,從中減去'a''A',並用其作爲索引ltrcnt

而且通過「內循環」 ,我的意思是j,你不需要for (k ...循環,據我所知。

如果您堅持使用k循環,請記得在每次啓動之前將c重置爲'a'

的最小修復的第二個問題是:

for(int i = 0; i < n; i++){ 
    for(int j = 0; str[i][j] != '\0'; j++){ 
     c = 'a'; // << was missing 
     for(int k = 0; k < 26; k++){ 
      if(str[i][j] == c){ 
       ltrcnt[k]++; 
      } 
      c++; 
     } 
    } 
} 

較好的修復,消除了內部循環是

for(int i = 0; i < n; i++){ 
    for(int j = 0; str[i][j] != '\0'; j++){ 
     if (str[i][j] >= 'a' && str[i][j] <= 'z') 
     { 
      ltrcnt[str[i][j] - 'a']++; 
     } 
    } 
} 
+0

我做出了您指出的更改,並且修復了第一個問題。但是,第二個問題仍然存在。如果我輸入「你好嗎」和「我的名字是鮑勃」,它表示h的數量是2,我是1,其他所有是0. –

+0

@ShoaibAhmed所以它得到了我的權利:)你的外部循環是(for =(i = 0; i JeremyP

+0

謝謝指出。我忘了在k循環之前設置c ='a',這很有道理,它導致了問題。謝謝。 –