C语言之getchar( )、EOF和memset( )

一、getchar()的用法

getchar是以行为单位进行存取的。当调用getchar函数读取输入时,只有当输入字符为换行符'/n'或文件结束符EOF时,getchar才会停止执行,整个程序将会往下执行。并且,如果输入行是以EOF结束的(EOF之前不是换行符),则EOF会被“吃掉”(即不会被getchar读取到)。譬如下面程序段:

    while((c = getchar()) != EOF)
        putchar(c);

执行程序,输入:abc,然后回车。则程序就会去执行puchar(c),输出abc和一个回车。输入终端驱动处于一次一行 的模式下。也就是虽然getchar()和putchar()确实是按照每次一个字符进行的。但是终端驱动处于一次一行的模式,它的输入只有到'/n'或 者EOF时才结束。本例中可将EOF改为'\n'可以得到预期结果。

程序段调用了getchar函数,则控制权从程序段转移到getchar函数,而getchar函数要依赖于操作系统的驱动 来读取输入,没遇到换行符或者EOF,驱动不会通知getchar函数,getchar函数处于“阻塞”状态。而遇到换行符或者EOF后,getchar函数解除“阻塞”,读取一个字符,控制权返回程 序段,执行putchar函数,循环执行。直到遇到EOF字符或者这行输入全部处理完。

 

二、EOF的用法

 EOF作为文件结束符时的情况:EOF虽然是文件结束符,但并不是在任何情况下输入Ctrl+Z(Linux下Ctrl+D)都能够实现文件结束的功能,只有在下列的条件下,才作为文件结束符。

(1)遇到getcahr函数执行时,要输入第一个字符时就直接输入Ctrl+Z;

(2)在前面输入的字符为换行符时, 接着输入Ctrl+Z;

(3)在前面有字符输入且不为换行符时,要连着输入两次Ctrl+Z,这时第二次输入的Ctrl+Z起到文件结束符的功能,至于第一次的Ctrl+Z作为行结束符;

即只有在getchar()提示新的一次输入时,直接输入Ctrl+Z才相当于文件结束符。

EOF作为行结束符时的情况,这时候输入Ctrl+Z并不能结束getchar(),而只能引发getchar()提示下一轮的输入。在进行getchar()新的一行输入时,当输入了若干字符(不能包含换行符)之后,直接输入Ctrl+Z,此时的Ctrl+Z并不是文件 结束符,而只是相当于换行符的功能,即结束当前的输入。

三、memset()的用法

memset()的头文件及函数原型为

    #include<string.h>
    void *memset(void *s, int ch, size_t n);

函数作用:将s中当前位置后面的n个字节用ch替换。

 注意:如果输入的是int,会自动转换成无符号字符型.

因此,memset()用来初始化字符数组,memset()可以初始化整数数组,但是初始化的值只能为0或者-1

四、应用:黑盒测试中的多点测试

黑盒测试是指系统后台会准备若干组输入数据,然后让提交的程序去运行这些数据,将输出的结果与正确答案完全相同(字符串的比较)。多点测试要求程序能一次运行所有数据,一般有以下三种输入方式:

(1)while(EOF)

黑盒测试中,所有输入数据都是放在一个文件中,系统会让程序去读取这个文件里的输入数据一直到文件结尾。这里用到scanf函数,其返回值为成功读入的参数个数,读入失败时返回-1即EOF。

    while(scanf("%d",&n) != EOF){
        ...
    }

输入字符串还可以用gets(str):

    while(gets(str) != NULL){
        ...
    }

(2)while break

在while(EOF)内部判断,满足条件时中断;

(3)while(n--)


 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值