getchar

函数原型:int getchar(void);

作用:从标准输入里读取下一个字符,相当于getc(stdin)。返回类型为int型,为用户输入的ASCII码或EOF。

例:

    while ((c = getchar()) != '\n')

       printf("%c", c);

    }

    do {

        c = getchar();

     } while ((c != 'a') && (c != 'l') && (c != 'x'))

详解:

    getchar函数的返回值是用户输入的字符的ASCII码,若文件结尾(End-Of-File)则返回-1(EOF),且将用户输入的字符回显到屏幕。如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取。也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才等待用户按键。

fgetc

函数原型:int fgetc(FILE *stream);

作用:从文件指针stream指向的文件中读取一个字符,读取一个字节后,并把位置标识符往前移动一个字节。

    该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。

例:

    c = fgetc(stdin)


    fp = fopen("file.txt","r");

    c = fgetc(fp);

详解:

    虽然返回一个字节,但返回值不为unsigned char的原因为,返回值要能表示-1(即为EOF)。

    会休眠,直到有输入。此函数默认就是阻塞方式打开,函数相当于读函数,没有数据,则会休眠。

gets

函数原型:char *gets(char *buffer);

作用:从stdin流中读字符串,直至接收到换行符或EOF时停止,读的结果存放在buffer指向的字符串

例:

    char str[10];

    gets(str);

详解:

        换行符不作为读取串的内容,读取的换行符被转换为null值。gets函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值,为了避免这种情况,我们可以用fgets()来替换gets()(在linux下,程序中用gets(),编译会有warning: the `gets' function is dangerous and should not be used)。

scanf

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

作用:从stdin中读字符串,将地址赋给s。  

例:

    char str[10];

    scanf("%s",&s)  

详解:

        没有输入会休眠,输入回车才返回。与gets(s)函数相似,但不完全相同,使用scanf("%s",&s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。

sscanf

函数原型:int sscanf(const char *str, const char *format, ...);

作用:从固定的字符串中读出。

返回值:

        成功:成功赋值的字段个数(不包括已读但没有赋值的字段个数),0表示没有给任何字段赋值。

        失败:返回-1。如果buffer或format是NULL调用指针,则返回 -1

例:

    char str[20] = "ab cde fg hij";

    int ret1;

    char str1[20];

    char str2[20];

    char str3[20];

    char str4[20];

    char str5[20];

    ret = sscanf(str, "%s %s %s %s %s", str1, str2, str3, str4, str5);

    此时,ret = 4(因为没有转化到str5);str1[20] = "ab"; str2[20] = "cde"; str3[20] = "fg"; str4[20] = "hij" 

fscanf

函数原型:int fscanf(FILE *stream, const char *format, ...)

作用:根据数据格式(format)从输入流(stream)(文件或者标准输入)中写入数据(argument)

例:

    int i;

    fscanf(stdin, "%d", &i);

详解:

    fscanf遇到空格和换行时结束,注意空格时也结束,fgets遇到空格不结束

fgets

函数原型:char *fgets(char *s, int size, FILE *stream)

作用:既可以用来从文件中读入字符串,也可以从屏幕上输入一字符串。

例:fgets(str,n,fp);

    str是存放在字符串的起始地址;

    n是一个int类型变量,表示读取字符串字符的最大数量

    fp是文件指针(此参数写成stdin即从屏幕取词);


    函数的功能是从fp所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满n-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符(这就是为什么第二个参数是n,而最多只能读入n-1个字符的原因,这个地方一定要注意,如下代码:

int len;

char str[128];

fgets(str,128,stdin);

len = strlen(str);

printf("len= %d\n", len);

如果是在标准输入里输入abcd回车

输出结果是:5而不是4。

所以在需要用到字符串长度的时候要特别注意下。

)。

因此,确切地说,调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加'\0',并以str作为函数值返回。

其他:

        不需要输入回车来获取输入的方式 网页收藏 Non-blocking user input...  参考此网页第三部分代码(nonblock函数,此函数中含有进入此模式和退出此模式的代码),写到stdin.c中的init和exit函数中去。里

 边的几个函数,用man ...来查找

       返回时,用select,网页收藏 Non-blocking user input...   参考此网页第一部分代码(kbhit函数)

  select函数详细讲解见《unix环境高级编程》

       获得输入的字符的函数,见网页收藏 Non-blocking user input... 第四部分(main),

  用的c = fgetc(stdin)