`
paddy.w
  • 浏览: 505086 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于getchar()、scanf()、gets()

    博客分类:
  • C
 
阅读更多
        在看K&R的时候对于getchar()产生了一点疑问,下面根据自己的理解和几个例子说明一下。

        Q1:关于EOF
#include <stdio.h>

int main() {
    int c;

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

    return 0;
}

        如果输入hello回车,输出结果如下:
hello
hello

        此时再输入ctrl+D(即linux下的EOF表示),程序结束。如果输入hello之后不输入回车,而是EOF,此时程序并没有结束,而是可以继续输入,但并不换行。若再直接ctrl+D那么程序结束。
        这说明,当getchar()读取到换行符的时候,认为此次输入结束。程序换行,执行putchar()输出刚才输入的内容。如果不以回车,而以EOF作为结尾,getchar()仍然并且只是认为此次输入结束,而不是结束程序。当EOF单独出现的时候,getchar()才认为是输入行为终止。

        Q2:getchar()获取几个字符?如何执行的?
        在上面的例子中,输入hello,输出hello。那程序执行的过程是不是getchar()获取到了hello,将其赋给c,判断c!=EOF,输出c?看下面这个例子
#include <stdio.h>

int main() {
    int c;

    c = getchar();
    putchar(c);
    /*
    c = getchar();
    putchar(c);
    */
    return 0;
}

        还用'hello'作为例子,当我们输入hello回车时,程序输出h,然后结束。很显然,getchar()只获取到了一个字符。
        当把注释去掉,再次执行程序。输入hello回车,输出he。程序中出现了两次getchar(),但整个过程中只有一次键盘输入过程,也即第一次getchar(),第二次getchar()并没有要求终端输入。看来,将getchar()理解为请求终端获取输入也不完全正确。其实getchar()的执行的原理是这样的(有部分个人理解):
        用键盘输入字符的时候,输入的字符被放入了缓冲区,直到用户按下回车结束本次输入(回车符也被放入缓冲区)。其实getchar()是从输入流缓冲区中读取数据的,如果缓冲区中没有数据,则会进入等待,直到缓冲区有数据。这也就是程序执行到第一个getchar()时会等待用户输入的原因。当缓冲区有数据时,getchar()会从缓冲区获取第一个字符(显然,缓冲区是FIFO的),在例子中就是h,putchar(c)输出h,再次执行getchar(),获取到了e,putchar(c)输出e,程序结束。
        当然,假设只输入一个字符'a'的时候,也只需要一次键盘输入,程序就会结束。因为回车也算作一个字符,所以输入的其实是两个字符。直接输入回车的话,就需要输入两次才能结束程序。
        最后再看一个例子证明一下上面的判断:
#include <stdio.h>

int main() {

    int ch1, ch2;
    ch1 = getchar();
    ch2 = getchar();
    printf("%d %d", ch1, ch2);

    return 0;
}

        输入hello,输出104 101。这两个数字也正是h和e的ascii码。

        Q3:关于getch()
        getch()和getchar()类似,也是获取一个字符。不同的是getch()不从缓冲区获取,而是直接从键盘输入获取,也即输入一个字符,立刻返回一个字符,不需要按回车。

        Q4:关于scanf()
        scanf()类似getchar(),略有不同的是结束标志。看下面的例子:
#include <stdio.h>

int main() {

    char chs1[10], chs2[10];
    scanf("%s", chs1);
    printf("%s\n", chs1);
    scanf("%s", chs2);
    printf("%s\n", chs2);
    
    return 0;
}

        输入hello world,发现只需要一次输入,程序会输出两次,然后结束。scanf()与getchar()一样,也是从输入流缓冲区获取数据,不同的是,scanf()获取数据时如果遇到回车、空格或TAB则会停止,一次获取数据过程结束。第二个scanf()会继续从输入流缓冲区获取数据。
        在Q1中,如果输入hello回车,仔细观察的话会发现,输出也是hello回车,说明getchar()也获取了缓冲区的回车符。如果在上面这个例子中输入hello回车,输出也是hello回车,并且程序没有结束而是继续等待用户输入,这说明第二个scanf()从缓冲区获取不到数据了,然后等待用户输入,输入world回车,输出world,程序结束。即下面的结果:
hello
hello
world
world

        首先说明,scanf()丢弃了输入hello后的那个回车符,也即scanf()读取字符串会丢弃结尾的回车符。从这个例子中也可以看出,输入hello回车,输出也是hello回车,但是printf()中有一个\n换行符,如果scanf()能获取到hello后面的回车的话,输出结果应该下面这个样子的:
hello
hello

world
world



        这也说明了scanf()会丢弃字符串结尾的回车符。但注意,回车符并没有被scanf()跳过而残留在缓冲区内,而是被scanf()获取但是丢弃了,此时缓冲区内的回车符已经不存在了。

        Q5:关于gets()
        gets和scanf()的用法类似,但是gets()可以获取带空格的字符串,看这个例子:
#include <stdio.h>

int main() {

    char chs1[10], chs2[10];
    gets(chs1);
    printf("%s\n", chs1);
    gets(chs2);
    printf("%s\n", chs2);
    
    return 0;
}

        输入hello world,输出hello world,并继续等待用户输入,输入helloTABworld,输出helloTABworld(TAB代表键盘的tab键,输入制表符),程序结束。
hello world
hello world
hello    world
hello    world

        gets()并不会因为字符串中有空格或者TAB而结束字符的获取,但和scanf()一样,会忽略字符串结尾的回车符。

        清除缓冲区内的残留数据
        1、利用函数fflush(stdin)
        注意:ANSI C中并没有将这个函数作为标准的一部分,是编译器支持的,并不是所有编译器都支持这个函数。所以,严格的讲,这样并不具备绝对的可移植性。
        2、手动取出缓冲区里的残留数据
        scanf("%[^\n]",str);
分享到:
评论

相关推荐

    C++深入了解scanf()getchar()和gets()等函数

    C++深入了解scanf()getchar()和gets()等函数 在C++编程中,scanf()、getchar()和gets()等函数都是标准输入函数,用于从键盘或输入流中读取数据。但是,这些函数的使用却存在一些隐患和陷阱,导致程序的执行结果与...

    scanf(), getchar(), 以及gets()函数注意点

    scanf(), getchar(), 以及gets()函数注意点 scanf(), getchar(), 和gets()函数都是标准输入函数,它们在C语言中使用非常频繁,但是在实际应用中却常常因为使用不当而导致问题。下面我们将深入剖析scanf()、getchar...

    C语言中getchar, gets, 和 scanf 三种不同函数的区别

    在C语言中,getchar、gets和scanf是三个常见的输入函数,它们各自有着特定的用途和特点。在理解和使用这些函数时,理解它们之间的差异至关重要,以确保代码的安全性和效率。 首先,`getchar()` 函数是用于读取单个...

    在输入输出字符串时scanf(),printf()和gets(),puts()的区别浅谈

    在C语言中,输入输出字符串时,我们经常使用`scanf()`、`printf()`、`gets()`和`puts()`这四个函数。它们各自有着特定的用途和特性,理解它们的区别对于编写有效的C语言程序至关重要。 首先,`scanf()`和`gets()`...

    6-数据输入scanf函数.pdf

    - getchar():用于输入单个字符,读取一个字符后立即返回。 - getche():立即读取一个字符,但不等待用户按回车键,常用于不回显输入的场景。 - getch():同样用于输入单个字符,和getche()类似,但也是在Windows...

    C语言程序设计中键盘输入数据的方法分析.pdf

    本文将探讨C语言中常用的几种键盘输入数据的方法,包括scanf、getchar和gets等函数的使用、对比以及各自的注意事项,旨在帮助读者正确地使用这些函数进行数据输入。 1. scanf函数:scanf函数是C语言中最常用的格式...

    C语言程序设计中键盘输入数据的方法研究.pdf

    C语言程序设计中,技术人员可以使用scanf()、getchar()和gets()函数来获取键盘输入数据。scanf()函数可以获取键盘输入,并将获得的数据存放入指定的空间中。getchar()函数主要用于读取键盘输入的一个字符,而gets()...

    C语言期中考试试卷.pdf

    4. 输入函数:本题考查了C语言中的输入函数,包括scanf、getchar、gets等。 知识点:输入函数、scanf、getchar、gets 5. 赋值运算符:本题考查了赋值运算符的使用,包括简单赋值、加法赋值、乘法赋值等。 知识点...

    C语言-输入输出函数笔记

    在本笔记中,我们将介绍C语言中常用的输入输出函数,包括getchar、putchar、scanf、printf、gets和puts等。 getchar函数 getchar函数的原型为`int getchar(void)”,其功能是从键盘读取一个字符,并返回读取的字符...

    c语言输入的各种注意问题

    常见的输入函数有getchar、scanf、gets、getche、getch等,每个函数都有其特点和用法。下面将详细介绍这些函数的特点和区别。 getchar函数是stdio.h库函数,它的作用是从stdin流中读取一个字符。它等待输入直到按...

    C语言第一课 printf scanf

    此外,还有`putchar`、`getchar`、`puts`、`gets`等辅助函数,以及与文件操作相关的`fprintf`、`fscanf`等。`#include`预处理指令用于引入头文件,头文件通常包含了函数声明和常量定义。`&lt;stdio.h&gt;`是标准库中的...

    第8章 指针-3字符数组和字符指针 - 字符串的输入和输出1

    - 使用`gets(str)`后,`getchar()`会等待用户输入新的字符,因为回车已经被`gets`处理掉。 理解这些差异对于编写处理字符串的C程序至关重要,特别是在涉及用户交互和输入验证时。指针在此处的作用主要是允许我们以...

    C语言中的输入语句.pdf

    本文档主要介绍了C语言中的输入函数,包括getchar()、gets()和scanf(),以及如何使用这些函数来接收用户输入的数据。 首先,输入输出操作需要通过C标准库中的函数来完成,因此在源文件中必须包含"stdio.h"头文件。...

    C输入输出库函数

    如:gets,puts,printf,scanf等。并且在原函数名前加my构成新函数名。如:mygets,myputs,myprintf,myscanf等。 对myprintf函数,其功能与printf函数相同。但只要求支持简单的%c,%d,%s,%f,%lf格式说明。不...

    C语言工程设计03输入输出.pptx

    这些函数包括printf、scanf、getchar、putchar、gets、fgets、fputs、fread、fwrite等。 例如: printf("Hello, World!\n"); scanf("%d", &x); getchar(); putchar(ch); gets(str); fgets(str, sizeof(str), fp); ...

    C语言与程序设计ppt-第3章1

    例如,你可以使用`getchar`和`putchar`来实现简单的字符交互,或者使用`printf`和`scanf`来处理更复杂的格式化数据输入和输出。在学习过程中,通过编写实例程序并运行测试,能更好地理解和掌握这些函数的用法。

    一图归纳C语言中文件的输入输出函数.pdf

    在C语言中,常见的输入函数包括:`scanf`、`getchar`、`gets`、`fscanf`、`fgets`、`getw`等。其中,`scanf`函数是格式输入函数,用于从标准输入设备(通常是键盘)读取输入数据并根据提供的格式控制字符串进行解析...

    chp3 linux.rar

    `getchar`没有参数,当用户输入一个字符并按下回车后,`getchar`会返回该字符的ASCII码值。如果发生错误,它同样会返回EOF。 格式化输入函数`scanf`与`printf`对应,但它是用于从标准输入读取数据。其原型为: ```c...

    C语言输入输出问题解析.pdf

    首先,我们要清楚,C语言的输入输出功能主要是通过标准库函数实现的,如输入函数scanf、getchar、gets,输出函数printf和puts等。这些函数是C标准库中定义好的,可以读取或写入不同数据类型的数据。 在处理输入问题...

    poj 2643解题报告

    while( scanf("%d",&n) != EOF ) { getchar(); memset( a , 0 , sizeof(a) ); for( i = 1 ; i ; i++ ){ gets( s1 ); gets( s2 ); index[ s1 ] = i; name[ i ] = s2; } scanf("%d",&m); ...

Global site tag (gtag.js) - Google Analytics