2016-02-18 89 views
-2

我是c編程的初學者。我有一個程序來計算txt文件中的字母並將計數存儲在一個數組中。當我這樣做的循環,如果我採取相同的代碼,並試圖把它變成一個功能,我的數組傳遞給函數,我得到Bus Error (core dumped)在我的主要功能一切計數但是工作正常在C函數中傳遞數組

#define SIZE 26 
#define UPPERCASEA 65 
#define LOWERCASEA 97 
#define SHIFTCASE 32 //difference between 'A'(int 65) and 'a'(int 97)  

int main() { 
    int letter = 0; 
    int letters[SIZE] = {0}; 

    printInstructions(); 

    // loopAndCountLetters(letters); 

    letter = getchar(); 

    // get rest of characters until EOF 
    while (letter != EOF) {  
     // if necessary change to uppercase 
     letter = changeToUpperCase(letter); 

     // increment proper letter in array 
     letters[letter - UPPERCASEA]++; 

     // get next letter 
     letter = getchar(); 
    } // end of while 

    printLetterArray(letters, SIZE); 

    return 0; 
} 

。下面的功能:在主要功能

函數調用:

loopAndCountLetters(letters); 

函數定義:

void loopAndCountLetters(int array[]) { 
    int letter = 0; 

    letter = getchar(); 

    // get rest of characters until EOF 
    while (letter != EOF) { 
     // if necessary change to uppercase 
     if (letter >= LOWERCASEA) { 
      // shift value to uppercase 
      letter = letter - SHIFTCASE; 
     } 

     // increment letter in array 
     array[letter - UPPERCASEA]++; 

     letter = getchar(); 
    } //end of while 

    return; 
} 

句子的例子可以正常工作:

這正常工作。

即使這個工程?是的,它確實。

這會導致錯誤

任何與冒號:導致錯誤

+5

請嘗試創建一個[最小,***完整***和可驗證示例](http://stackoverflow.com/help/mcve)並向我們顯示,幷包含您擁有的所有宏和其他定義目前被排除在外。例如,什麼是「SIZE」?或'LOWERCASEA'和'UPPERCASEA'?或SHIFTCASE? –

+3

爲什麼你不使用['toupper'](http://en.cppreference.com/w/c/string/byte/toupper)? –

+0

發佈所有符號的定義。函數中的代碼與'main'中的前一個代碼不同。 – chqrlie

回答

2

這裏我猜測,並假定UPPERCASEA等於'A'(或其ASCII encoding等同)。

問題是,那麼當你幾乎一切,這是不是一個實際的信做letter-UPPERCASEA,你會得到一個指數,這將導致未定義行爲

讓我們以冒號':'爲例。它的ASCII值是58'A'的ASCII編碼是65。所以,當你做

array[letter-UPPERCASEA]++; 

它實際上是一樣的做

array[58-65]++; 

等於

array[-7]++; 

數組中的索引之前,您應該過濾掉任何非字母。

而之前你問,它只是似乎工作在main功能。實際上它確實沒有。

+0

在主函數中當您引用負指數時會發生什麼?那麼問號怎麼樣,這將是數組[63-65]這將是相同的行爲? –

+0

@KailuaBum當你在一個單獨的函數中完成同樣的事情時:[*未定義的行爲*](http://en.wikipedia.org/wiki/Undefined_behavior)。只是不要這樣做,*任何地方*。 –

+0

在主函數中,包含冒號的最後一個句子不會產生錯誤。它統計所有的字母 –