题目要求统计从输入到文件结尾为止的字符数,本人编的代码如下:
#include <stdio.h>
int main(void)
{
int ch, num;
while ((ch = getchar ()) != “”\n””)
{
putchar (ch);
num++;
}
printf (“\n您输入了共%d个字符。\n”, num);
return 0;
}
在windows devC++ 编译器上运行没有问题,但是本人想用EOF判断,可是无法实现。
书中实例代码给出这样的:
#include <stdio.h>
int main(void)
{
int ch;
int ct = 0;
#include <stdio.h>
int main(void)
{
int ch, num;
while ((ch = getchar ()) != “”\n””)
{
putchar (ch);
num++;
}
printf (“\n您输入了共%d个字符。\n”, num);
return 0;
}
在windows devC++ 编译器上运行没有问题,但是本人想用EOF判断,可是无法实现。
书中实例代码给出这样的:
#include <stdio.h>
int main(void)
{
int ch;
int ct = 0;
while ((ch = getchar()) != EOF)
ct++;
printf(“%d characters read\n”, ct);
return 0;
}
可是本人还是运行不出来!
解决方案:5分
解决方案:5分
这是一个比较恶心的问题。
本人认为主要有2点:
第一点 是2楼说的 EOF 输入方法;
第二点是 输入缓冲区的问题。
getchar()是使用缓冲区的函数,你不按回车或缓冲区不满他不会执行,
本人认为你应该想要使用非缓冲区的方式,应该使用getch(无缓冲无回显)或getche(无缓冲有回显),
但是他们不会将EOF识别为EOF宏(-1), 所以最好使用getche函数,但是getche回显EOF有错误(win8 vs2013),
所以折中的方式是使用getch然后手动回显。
本人认为主要有2点:
第一点 是2楼说的 EOF 输入方法;
第二点是 输入缓冲区的问题。
getchar()是使用缓冲区的函数,你不按回车或缓冲区不满他不会执行,
本人认为你应该想要使用非缓冲区的方式,应该使用getch(无缓冲无回显)或getche(无缓冲有回显),
但是他们不会将EOF识别为EOF宏(-1), 所以最好使用getche函数,但是getche回显EOF有错误(win8 vs2013),
所以折中的方式是使用getch然后手动回显。
#include <stdio.h> #include <conio.h> int main(void) { int ch; int ct = 0; while ((ch = getch()) != 0x1A) { putchar(ch); ct++; } printf("\n%d characters read\n", ct); return 0; }
解决方案:5分
EOF这种判断一般在文件处理时比较常见,而对于输入字符由于EOF属于特殊字符,就需要用到二楼的方法。尽信书不如无书,书中写的只是一个标准,怎么样理解实现才是关键。
解决方案:5分
这方法不错,关键是C,C++标准,不知道出于什么原因考虑
Io.h
conio.h
这两个头文件里面的函数,不是标准库的一部分。
因此
C,C++标准库 里面,只有cook 控制台可用。(一次读取一行)
raw 控制台 不可用。
而输入立即执行,需要用到 raw 控制台 的功能(一次读取一个字符)
EOF 实际上是底层IO (包括非缓冲,和缓冲两种)IO定义的 常量。(句柄或叫文件代号方式操作文件)
但是,也被流式IO 接受了。(C,C++流)
流式IO 是对底层IO的封装
并且,不再暴露非缓冲IO给你用了
Io.h
conio.h
这两个头文件里面的函数,不是标准库的一部分。
因此
C,C++标准库 里面,只有cook 控制台可用。(一次读取一行)
raw 控制台 不可用。
而输入立即执行,需要用到 raw 控制台 的功能(一次读取一个字符)
EOF 实际上是底层IO (包括非缓冲,和缓冲两种)IO定义的 常量。(句柄或叫文件代号方式操作文件)
但是,也被流式IO 接受了。(C,C++流)
流式IO 是对底层IO的封装
并且,不再暴露非缓冲IO给你用了