Skip to content

另请参阅:[[C/输出]]

getchar()

  1. 返回读入字符的
  2. 在读取结束或者失败时,返回==EOF==(-1)

getchar一次只能从缓冲区读取一个字符,while循环直到getchar读取完最后一个字符并返回==EOF==(-1) EOF可通过Ctrl+Z输入终端

  • putchar(int c):输出对应ASCII字符
  • char中存放的是字符的ASCII码值

gets(char *str)

读取缓冲区中的一整行并存放至[[C/指针]]所对应的对象中

读入

scanf("%*d %d")

加*的只作为该格式读入,但不存入变量

int putchar(int ch)

putchar函数用于字符输出,ch可以为字符型变量或整型变量或常量

int getchar()

getchar函数用于从缓冲区中读取一个字符,并从缓冲区中清除该字符,返回该字符的ASCII码值

  • 清除缓冲区操作
  1. 使用getchar连续读清除
C
while(getchar()!='\n')
	continue;

这种方法在缓冲区中不存在换行符、存在多个换行符的时候会存在问题,且清除缓冲区的时候可能要求按下回车键以将输入内容传入缓冲区,影响程序运行效果。 等价写法scanf(“%*[^\n]%*c”) 2. 调用fflush(stdin) C标准没有明确规定该函数,部分编译器可能不支持,但不会报错,只是缓冲区中的内容依然存在。 3. 调用setbuf() 使用setbuff(stream,NULL)禁用缓冲区,会影响文件I/O性能,部分linux/windows编译器不支持。 4. 自动检测有输入时清除缓冲区

C
#include <stdio.h>
#include <cinio.h>
while (_kbhit()){
    getch();
}

char *gets(char *str)

str指向要存储输入字符串的字符数组的指针 读取一行字符串且包括行末换行符 返回存储数组的指针 无法限制输入的最大长度

char *fgets(char *str, int n, FILE *stream)

读取字符到遇到换行符或n-1个字符(因为结尾含有字符串结束符‘\0’)时停止

缓冲区

scanf 和 getchar 都是输入函数,但它们不是直接从键盘上来读取我们的数据。它们和键盘之间有一个区域叫缓冲区。缓冲区用于减少程序输入时的等待时间,提高运行效率。 输入函数先来看缓冲区中是否有数据,如果有,它直接就拿走了,不需要从键盘输入,如果缓冲区什么都没有,则需要从键盘输入,再拿走

实例

  • 实例1
C
scanf("%d",password);//输入123456回车将数据置入缓冲区,实际为123456\n,scanf取走回车之前的数据,缓冲区还剩下\n
ch = getchar();//由于缓冲区还剩下\n,getchar直接取走\n,无需键盘输入该行代码即可执行
//判断语句直接判断/n的ASCII码值从而导致判断不符合预期
  • 解决方法:清空缓冲区
C
scanf("%d",password);
getchar();//取走\n
ch = getchar();
//条件判断
  • 实例2:输入密码有空格
C
scanf("%d",password);//缓冲区存放114514(空格)1919810\n
getchar();//取走\n
ch = getchar();
//条件判断

scanf函数特性为读到空格后不再读取,故scanf执行完后,缓冲区还剩下(空格)1919810\n,getchar读走空格后第三行读到的为1,进而判断错误

  • 解决方法:循环调用getchar()清空缓冲区
C
#include <stdio.h>
int main()
{
    int password = 0;
    printf("请输入密码\n");
    scanf("%d", password); // 123 456
    while (getchar() != '\n')
    {
        ;
    }//清空缓冲区
    printf("请确认密码Y/N\n");
    int ch = 0;
    ch = getchar();
    if (ch == 'y')
    {
        printf("设置成功\n");
    }
    else
    {
        printf("请再次确认密码\n");
    }
}

汉字的数组存储^[C 语言数组存储汉字问题小结_c语言数组怎么存放汉字_正阳Liu的博客-CSDN博客]

使用 C 语言的内置 char 类型的数组,就可以存储中文了。比如 char[2]可以存储一个中文。


  1. While循环与getchar()组合的困难及理解https://blog.csdn.net/m0_53558236/article/details/119744614_while循环getchar_坐标方向的博客-CSDN博客(稍后阅读)