2013-06-24 16 views
1

我目前正在通过K & R,我已经成为卡住,在搜索网络后,再次尝试,并搜索更多我来到stackoverflow为帮帮我!使用getchar时奇怪的行为,计算一个字的字符数

的任务是创建一个直方图,该直方图聚合每个单词中的字母数,然后将该信息显示为直方图。

我已经想出了直方图部分,但是我在计算单词时遇到了问题。

当我输入几个字,然后按Ctrl + D发送EOF,并打印每个字符输入的出现次数;我与索引大值[0] noramlly以防万一“15773951”

只是为了澄清我的代码将不断加入到厕所返回,用于计算字符,直到一个空格,换行或选项卡found.it将值然后使用一个数组来存储每个字大小发生的次数,方法是增加与字大小相等的索引位置。

int main(void){ 
     int c, i, status, wc; 
     int numbers[array_size]; 
     wc = 0; //used to count number of chars 

    //innitialize array 
    for(i=1; i<array_size; i++) 
      numbers[i] = 0; 

    /*start counting letters*/ 
    while((c = getchar()) != EOF){ 
      /*check if c is a space*/ 
      if((c=' ')||(c='\t')||(c='\n')){ 
        numbers[wc-'1']++; 
        wc = 0; 
       }else{ 
         ++wc; 
      } 
    } 


     printf("word size occured: "); 
     for(i=0;i<array_size;i++) 
       printf("%d\n", numbers[i]); 

} 

有代码,任何人都可以向我解释为什么这种事总发生 也在这里是输出的一个例子:

word size occured: 15773951 
0 
0 
0 
0 
0 
0 
0 
0 
0 
+0

你为什么不分配给零'号[0]'? if((c ='')||(c ='\ t')||(c ='\ n')){':“=”而不是“==”中的另一个错误。 –

+1

另外,请注意代码'numbers [wc-'1'] ++;'是危险的,你应该检查索引是否大于或等于数组的长度,否则你会得到讨厌的记忆错误。 (这也造成了很多安全漏洞......) –

+0

感谢那里的金块科林! – Babbleshack

回答

4

好了,所以:

1.

// Here you subtract from wc the integer value of the 
// character '1' (which is ~49) 
numbers[wc-'1']++; 

应该是

numbers[wc-1]++; 

2.

// The array starts at index 1, ignoring the very first one ie. zero 
for(i=1; i<array_size; i++) 

应该是

for(i=0; i<array_size; i++) 

3.

// Here you assign the value ' ' to the variable c, which is equivalent to do: 
// if((' ')||('\t')||('\n')){ which is equivalent to do: 
// if((' ' != 0)||('\t' != 0)||('\n' != 0)){ which is always true 
if((c=' ')||(c='\t')||(c='\n')){ 

应该

if((c==' ')||(c=='\t')||(c=='\n')){ 
+0

谢谢,其中2人发生了,因为我在调试时跑出了主意 – Babbleshack

+0

很高兴帮助:) –

2

你混合分配了相等比较....

if((c=' ')||(c='\t')||(c='\n')){ 

应该

if((c==' ')||(c=='\t')||(c=='\n')){ 

当然,你应该有一个编译器警告...使用gcc你应该添加-Wall到命令行,所以你不必再次调试。

有关所有可用警告选项的详细信息,请参见gcc warning options

+0

aww男人我现在感觉很傻,谢谢加载,并且我应该只用-Wall选项重新编译来添加警告? – Babbleshack

+0

是的,添加-Wall选项,并希望你会得到警告。然后你可以修复它。对于这些容易犯的错误总是很好的警告。 –

+0

再次感谢,获得有关编译器选项信息的任何链接? – Babbleshack