2016-02-07 92 views
-1

我有一个简单的程序(基于C编程语言编辑2节1.5.2书中的例子)用于字符计数。该程序本身非常简单,但我没有得到期待的结果。C用于循环执行

看来,numberOfChars增加了两次,我不是为什么......?

我使用的cygwin + gcc编译器,请参阅图像:compilation+test

int main() { 
    int numberOfChars; 

    for(numberOfChars = 0; getchar() != EOF; numberOfChars++) 
     ; //null statement 

    printf("Number of chars = %d\n", numberOfChars); 

    return 0; 
} 

感谢:-)

+2

对于空语句,使用'{}'而不是';'。因为'for'循环后面的'''可能看起来像一个错字,而当它是一个类型时,由于这个原因它是一个非常复杂的错误,因此一些编译器会在你的代码中发出警告。请张贴输入,实际结果和期望的结果。 –

+3

请勿将文字作为图片发布。相反,将文本复制/粘贴到问题中。 – fuz

+1

@Pavel getchar读取包括新行字符的所有字符。所以如果你按Enter键,那么'\ n'也被计算在内。 –

回答

0

任何帮助,为了得到一个3,你可以写:

#include <stdio.h> 

int main() { 
     int numberOfChars = 0; 

     do { 
       while(getchar() != '\n') 
         numberOfChars++; 
     } while(getchar() != EOF && numberOfChars++); 

     printf("Number of chars = %d\n", numberOfChars); 

     return 0; 
} 

然后按Ctrl + D退出嵌套循环。

事实上,你的程序是正确的。它给了你6,因为你输入了6个字符:1,\n,2,\n,3,\n

+1

这是一个不可思议的代码,没有通过省略外部'do ... while'循环体的括号来实现。如果循环体本身是一个复合语句(比赋值或函数调用更复杂)使用大括号。我可以看到代码是如何工作的。我不确定代码是否是有用的修改。它也不计算额外的换行符,所以它给出了错误的答案。向代码发送EOF指示也会将其发送到一个tizzy。 –

+0

@JonathanLeffler改进,看起来更好? –

+1

不止一次调用getchar是非惯用的C,提问者只需要在一个文件上运行该程序,他可以使用'od -c'来检查该文件以避免混淆 – Rob11311

0

创建一个文件,然后运行cygwin的OD程序,其次是C范例程序运行:

od -x < testfile 
a.out < testfile 

然后你就可以看到你的文件中有什么&多少个字准确,避免意外。

辅助调试,如果我怀疑是出事了,我想补充喜欢的事:

int c; for(numberOfChars = 0; (c = getchar()) != EOF; numberOfChars++) 
    printf("\0x%x", c); 

要理解我的代码是做处理。