输入函数对比

来源:互联网 发布:cocos2d-js webgl 编辑:程序博客网 时间:2024/06/05 19:40

0 scanf

(0)      函数原型:int scanf(const char * restrict format,...);

(1)      返回值:返回成功读入的数据项数,注意是数据项数;例如scanf(“%d %d”, &a, &b),如果a、b都被读入则返回2,如果只有a被读入则返回1。

(2)      标准的库函数,包含在#include <stdio.h>中。

(3)      读字符规则:scanf函数不检测读入的字符的个数。仅仅是不断的从标准输入流(键盘)中读入字符,直到遇到“空白符”(换页符、纵向制表符、横向制表符('\t')、空格(' ')、换行符('\n')、回车符('\r'))。

1 gets / fgets

(0)函数原型:char *fgets(char *buf, int bufsize, FILE *stream)  char * gets ( char * buf )。

(1)返回值:如果正常则是返回与参数buf相同的指针。

(2)标准的库函数,包含在#include <stdio.h>,gets包含在#include <string.h>中。

(3)两者区别在于:fgets由于有参数bufsize的限制,所以会更加安全,另外各自的读取字符规则也有较大的区别,详见下述。

(4)读字符规则:对于fgets,读取一行数据,包括回车。如果该行内容不足bufsize个字符,则正常结束,如果该行内容超过bufsize-1个字符,则fgets只返回一个不完整的行。缓冲区残留内容会在下一次重新被fgets读取,当然如果没有手动重新fgets可能就会被丢弃。对于gets函数,读取一行数据,直到输入回车才返回,且不会存储回车,所有除回车以外的数据会被存储在指定的缓冲区中。注意这里是最多10个字节

(5)程序示例,如下所示。

//keyboard input "01234567890123\n"

//output "012345678"  //10表示的最多接收9个字符

//        "90123"//这个是用户输入的回车字符

//        "" //回车,printf的回车

//        “ ” //光标所在位置

 

    char buf[10]= { 0 };

    while (fgets(buf,10,stdin)){//最多9个字符,剩余的再下一次while中读取

        printf("%s\n", buf);

    }

 //keyboard input "01234567890123\n"

//output "01234567890123"   //回车,printf的回车

//        "" //光标所在位置

    char buf[20]= { 0 };

    while (gets(buf)){

        printf("%s\n", buf);

    }

2 getc / fgetc

(0)函数原型:int getc(FILE *stream)   int intgetc(FILE *stream)

1)返回值:读取的字符。

2)标准的库函数,包含在#include<stdio.h>

3)两者区别在于:fgetc是函数,而getc是基于fgetc实现的宏。对比分析在于2点,首先getc是基于宏没有函数调用,所以理论上会更高效,没有堆栈的调用约束,但是如果在寄存器充足的情况,这种差别可以忽略。其次,getc因为是宏,所以也需要注意宏的副作用。综上,建议使用fgetc

4)读字符规则:等待用户输入,直到按下回车才结束,此时把缓冲区的内容逐个显示,包括回车字符。

5)程序示例,如下所示。

//keyboard input "abc\n"

//output " -- a"

//        " -- b"

//        " -- c"

//        " --  " //回车,这个是用户输入的回车字符

//        "      " //多出一个空行,是printf里的回车

while (ch = getc()){

    printf(" -- %c\n", ch); 

}

 

//keyboard input "abc\n"

//output " -- a"

//        " -- b"

//        " -- c"

//        " --  " //回车,这个是用户输入的回车字符

//        "      " //多出一个空行,是printf里的回车

while (ch = fgetc()){

    printf(" -- %c\n", ch); 

}

3 getch / getche

(0)       函数原型:int getch(void)int getche(void) 

(1)      返回值:读取的字符;

(2)      这两个不是C标准库函数,需要#include <conio.h>。为了程序可移植性不推荐使用;

(3)      两者区别在于getch不带回显,而getche是带回显的。

(4)      读字符规则:等待用户从键盘输入,用户一旦按下按键,无论是否包含回车,函数都会返回。

(5)      程序示例,如下所示。

//keyboard input "abc"

//output " -- a"

//        " -- b"

//        " -- c"

while (ch = getch()){

    printf(" -- %c\n", ch); 

}

 

//input "abc"

//output "a -- a"

//        "b -- b"

//        "c -- c"

while (ch = getche()){

    printf(" -- %c\n", ch); 

}

 

0 0
原创粉丝点击