2016-02-18 90 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

在主函数中,包含冒号的最后一个句子不会产生错误。它统计所有的字母 –