这是一个简单的程序,计算字符串,符号和单词。
使用Cygwin进行计算时一切正常。
但是在启动时,在输入值之后,程序不会打印nc
,nw
,nl
并等待输入更多值。
将EOF
更改为13(回车)无论如何都无济于事。
ctrl + Z 也很有用:程序正在停止,写[n]+ Stopped
,其中' n'总是不同的数字。
代码是
#include <stdio.h>
#define IN 1
#define OUT 0
int main () {
char c;
int state;
int nc, nw, nl;
state = OUT;
while ((c=getchar()) != EOF) {
nc++;
if (c == 'n')
nw++;
if (c == '\n' || c == ' ' || c == '\t')
state = OUT;
else if (state = OUT){
state = IN;
nw++;
}
}
printf ("%d %d %d", nc, nl, nw);
}
答案 0 :(得分:4)
getchar
返回int
,而不是char
。它必须这样做,因为它可以返回一个字符值或返回特殊值EOF
来指示输入文件的结束。由于EOF
必须与char
类型的所有值不同,因此它不具有char
类型。因此,您需要将包含其返回值的变量定义为int
,而不是char
。
在某些平台上,char
类型已签名,getchar
函数实际上并不返回字符值,而是将字符值包装为非负值。实际上,这意味着ASCII字符不变,但在某些平台上,非ASCII字符转换为128到255之间的值,而不是-128和-1之间的值。因此,当您将其用作字符时,通常需要将getchar
的返回值强制转换为char
。在char
类型未签名的平台上,这不会改变任何内容,但在char
类型已签名的平台上,必须避免将字符255误认为文件的末尾。
int c;
…
while ((c = getchar()) != EOF) {
…
if (c == 'n') /* ok because 'n' is part of ASCII and thus always positive */
…
if ((char)c == some_other_char) /*cast needed in general*/
…
}
在Cygwin中,与其他类Unix系统一样,在行的开头按 Ctrl + D 表示输入结束。在Windows下,您需要按 Ctrl + Z (在Cygwin下,再次像其他类Unix系统一样,它会暂停程序:它已停止,但可以恢复使用命令bg
)。这些都没有向程序发送控制字符,它们发送文件结束指示,其中C getchar
实现转换为EOF
值。
答案 1 :(得分:1)
初始化您用来计算的变量:
int nc = 0, nw = 0, nl = 0;
当你不这样做时,他们会得到随机值。
另外,你计算单词的逻辑是错误的。
else if (state = OUT)
你可能意味着else if (state == OUT)
。
答案 2 :(得分:1)
#include <stdio.h>
#define IN 1
#define OUT 0
int main()
{
int c, nl, nw, nc, state; //c is an int not a char
state = OUT;
nl = nw = nc = 0; // initialize variables to 0
while ((c = getchar()) != EOF) {
++nc;
if (c == '\n') // if c is a newline character
++nl; //increment no of lines
if (c == ' ' || c == '\n' || c == '\t')
state = OUT;
else if (state == OUT) // == for comparing
{
state = IN;
++nw;
}
}
printf("%d %d %d\n", nl, nw, nc);
return 0;
}
你的程序看起来应该像上面那样。 c
是int
而不是char
,因为getchar
会将输入转换为unsigned char
,因为它不能保留负值,因为EOF
成立-1,while
循环永远不会结束。
当你按下CTRL + Z(在Windows中按CTRL + D)时结束,因为按下它将模拟EOF
中的stdin
。
答案 3 :(得分:0)
你这里有很多错误。
int nc, nw, nl;
应该是
int nc = 0, nw = 0, nl = 0;
else if (state = OUT){
我认为你的意思是
else if (state == OUT) {
ENTER是10而不是13。
cygwin上的getchar()在文件末尾返回-1(我不知道为什么)。所以你可以用-1代替EOF。 您可以这样测试您的程序:./ program.exe&lt;查找inputfilename
答案 4 :(得分:0)
还有这个问题吗?可能已找到解决方案: 如果你键入一些字符然后按ctrl-z,那么ctrl-z算作普通字符(代码26),但是在一行的开头(意思是:除了ctrl-z字符之外你不要键入任何内容) )它算作EOF。这样:
while ( (ch=getchar())!=26 ){
if (ch==EOF) break;
}
这样在你输入ctrl-z char的地方并不重要,迭代结束。