美文网首页
getchar()在while循环里面的问题

getchar()在while循环里面的问题

作者: 糖炒0栗子 | 来源:发表于2016-12-31 20:21 被阅读316次

getchar()是C语言里一个字符输入函数,当它被调用的时候会从当前的文本流中读取一个字符, 并将其结果返回,我们看下面的一段程序:

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int c, n;
    while ((c = getchar()) != EOF) {
        ++n;
    }
    printf("\"n\" = %d\n", n);
    
    return 0;
}

注意:
这里的字符c之所以声明为int而不是char,是因为EOF的值是-1,我们不能把-1赋值给一个char变量。而且char本身就是int类型 。

上面程序的意思是:
我们从输入流里面读取一个字符, 并把这个字符赋值给c, 如果c不是文件结束符EOF的话,我们就把n加上1,继续读取下一个字符并且赋值给c,继续我们的循环 。
如果c是文件结束符,那么退出循环,程序继续运行(也就是打印字符个数n)。

可是运行程序我们会发现,在我们输入一段字符串并回车的时候,循环并不会结束,终端还会提示我们继续输入。
这是因为Enter在ASCII码中也是一个字符(ASCII码为13),也就是说while循环并没有结束。

怎么才能输入EOF呢?
在Linux下是control + d

下面我们运行程序,输入asdfg,回车,control + d ,我们很高兴看到终端打印出如下信息:

"n" = 6
Program ended with exit code: 0

n=6是因为我们还输入了一个回车。

然后我们发现了另外一个问题,如果我们在输入asdfg之后,并没按回车,而是直接control + d ,程序并没有往下运行,而是依然处于“阻塞”状态。这又是为什么?

==============以下引用自百度文库==============
因为EOF虽然是文件结束符,但并不是任何情况下输入control + d都能实现文件结束的功能的,只有在下列情况下输入control + d才会有效:

1.遇到getcahr函数执行时,要输入第一个字符时就直接输入Ctrl+D;
2.在前面输入的字符为换行符时,接着输入Ctrl+D;
3.在前面有字符输入且不为换行符时,要连着输入两次Ctrl+D,这时第二次输入的Ctrl+D起到文件结束符的功能,至于第一次的 Ctrl+D作为行结束符。

其实,这三种情况都可以总结为只有在getchar()提示新的一次输入时, 直接输入Ctrl+D才相当于文件结束符。

为了说明这个问题,我们在while循环中插入一段代码,插入后的程序如下:

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int c, n;
    while ((c = getchar()) != EOF) {
        putchar(c);
        ++n;
    }
    printf("\"n\" = %d\n", n);
    
    return 0;
}

我们插入了一个putchar()函数用于输出。
这时,我们输入qwer,然后control + d, 我们来看终端的打印结果:

qwerqwer

其中前面的qwer是我们输入的,后边的才是打印结果。然后出现了光标(也就是说我们可以继续输入),这时,如果我们继续control + d,终端会打印

Program ended with exit code: 0

程序结束,我们就不能输入了。
至此,我们可以看出control + d作为行结束符文件结束符的区别。

相关文章

  • getchar()在while循环里面的问题

    getchar()是C语言里一个字符输入函数,当它被调用的时候会从当前的文本流中读取一个字符, 并将其结果返回,我...

  • 万能清空缓冲区数据语句

    while ((ch = getchar()) != EOF && ch != ‘\n’);

  • 微博采集

    成果 morelinks()### 注意里面的while和for循环因为i=i+1是在try里面的,所以有问题的时...

  • 第九节课笔记

    for循环 我们在使用while循环或者do-while循环的时候, 经常会忘记给循环变量自增,为了解决这个问题,...

  • for、break和contiune笔记

    #for循环 我们在使用while循环或者do-while循环的时候, 经常会忘记给循环变量自增,为了解决这个问题...

  • C语言学习 day4

    循环语句 while循环 //在while循环中,break用于永久地终止循环//在while循环中,contin...

  • Python 循环后else

    关于while和for后面的else问题 敲黑板敲黑板!while和for循环后面是可以跟else的,无奈基础不牢...

  • swift基础语法(四)——循环

    for循环 while循环 while的判断句必须有正确的真假,没有非0即真 while后面的()可以省略 do ...

  • 2.6 循环语句结合 Else 语句使用

    while循环语句结合else语句使用的语法:while 要判断的条件: 执行循环语句里面的代码else: ...

  • Swift 循环(for ,while, do..while)

    for循环 常见的写法 while循环 repeat...while循环 代替 do..while 注意 在swi...

网友评论

      本文标题:getchar()在while循环里面的问题

      本文链接:https://www.haomeiwen.com/subject/wwqbvttx.html