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); } |