首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

getch 和 putchar 没有返回就不能工作

getch 和 putchar 没有返回就不能工作

getch 和 putchar 是 C 语言中用于从标准输入读取字符和向标准输出写入字符的函数。在标准输入和输出被阻塞的情况下,这两个函数不会立即返回,而是等待用户输入或输出完成。

原因

在标准输入和输出被阻塞时,如果 getch 和 putchar 函数没有返回,它们将继续阻塞进程,阻止其他 I/O 操作。因此,在需要读取或写入多个字符时,我们需要使用非阻塞 I/O 或者 select()、poll() 等 I/O 多路复用函数。

解决方案

使用非阻塞 I/O 或者 I/O 多路复用函数来避免阻塞。例如,在 Linux 系统中,可以使用 fcntl() 函数将文件描述符设置为非阻塞模式。在 Windows 系统中,可以使用 open()read() 函数将文件描述符设置为非阻塞模式。

示例

代码语言:c
复制
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    int fd; // 文件描述符
    char c;
    
    fd = open("example.txt", O_RDONLY);
    if (fd < 0) {
        perror("open");
        return 1;
    }
    
    // 将文件描述符设置为非阻塞模式
    fcntl(fd, F_SETFL, O_RDONLY | O_NONBLOCK);
    
    while (1) {
        if (read(fd, &c, 1) == 0) {
            // 文件已关闭或无剩余字符
            break;
        }
        printf("Read: %c
", c);
    }
    
    close(fd);
    return 0;
}

在上面的示例中,我们使用 fcntl() 函数将文件描述符设置为非阻塞模式。如果读取文件结束或没有剩余字符,则文件描述符将返回 EAGAIN 错误。我们使用 while 循环不断读取字符,直到文件结束或无剩余字符。

总之,在 getch 和 putchar 没有返回就不能工作的情况下,我们需要使用非阻塞 I/O 或者 I/O 多路复用函数来避免阻塞,以确保程序的正确运行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C输入输出缓存

探究printf的现象 我们分别在windows系统linux系统上使用代码做以下操作: 输出"HelloWorld"十次,每次输出后暂停500毫秒。...输入缓存区 类似于输出函数(如printf,putchar)存在输出缓存,输入函数(如scanf,getchar)也存在输入缓存。 并且这些输入函数属于阻塞函数,当输入缓存区没有内容时。...getchgetche需要包含头文件conio.h才可以被使用 conio.h不是一个标准头文件,在windows下默认可以使用。近些年,为了区别平台实现函数与C语言标准函数。...= _getch(); putchar(c); c = getchar(); putchar(c); return 0; } 运行结果 123 1A2 过程如下 第一个getchar...随后’1’被putchar打印到控制台。 程序运行至getch,虽然输入缓存区中仍有数据,但是getch函数将阻塞等待键盘直接输入一个字符。 输入’A’后,getch解除阻塞状态。

1.6K30

c语言getchar()的用法_c语言getchar的功能

(1)语法 int getchar(void); (2)返回值 getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符...=’\n’),这里getchar();只是取得了’\n’但是并没有赋给任何字符变量,所以不会有影响,相当于清除了这个字符。...一起被释放,x到了程序里 回车(’\n’)也到了程序里,并且被第2个 getchar()获取,此时我们输入y,这时缓冲区里有一个字符 ‘y’, 然后我们又按下回车,‘y’’\n’又一起准备被释放,由于程序里没有第...getchar()与getch()的区别:   用getchar()时,在键盘上按一个字符后,要按回车才能读取进去;用getch()时,要包含头文件,在键盘上按一个字符马上就被读取进去...(2)格式:对于变量来说,格式为:putchar(ch);对于常量来说,格式为:putchar(‘ch’),对于转义字符来说,格式为:putchar(’\n’)。

4.7K60

c++输入隐藏密码的实现

最近在用C++编写一个图书管理系统, 其中需要用户的登录, 原来没有想太多, 就用了普通的cin输入, 但是前两天组里的同学说, 要是输入密码的时候能将其隐藏就好了。...最后百度谷歌后发现了一个很神奇的函数 实现 简而言之, 就是使用C++的getch()函数, 注意不是getchar, 这个函数可以使用户的输入不显示在屏幕上, 其包含在conio.h头文件中, 下面看代码...&str, int size) { char c; int count = 0; char *password = new char[size]; // 动态申请空间 while ((c = getch...putchar(' '); // 输出一个空格将原来的*隐藏 putchar('\b'); // 再回退一格等待输入 count--; } if (count == size - 1...} if ((c >= 'a' && c = 'A' && c = '0' && c <= '9')) { // 密码只可包含数字字母

1.7K40

用C语言实现经典游戏——贪吃蛇

控制流程:         1) 蛇头墙壁的碰撞         2) 蛇头蛇身体的碰撞         3) 蛇头食物的碰撞             1> 蛇身增长            ...s:(0, +1)     A:(-1, 0)     D:(+1, 0)     不回显:可以让键盘打的asdw不显示在输入界面         getch()    接收用户输入。    ...char key = getch();         编译时出错,尝试使用 _getch();  不阻塞:可以让输入的小蛇光标不阻塞         kbhit(); 不阻塞判断用户输入...有用户输入,返回 “真”, 否则返回“假”值。         ...[0].Y < HIGH 蛇头身体的碰撞 蛇头的坐标 任意一节身体的坐标 完全一致。

36720

开发成长之路(2)-- C语言从入门到开发(函数与定制输入输出控制函数)

是函数返回的值的数据类型。...有些函数执行所需的操作而不返回值,在这种情况下,return_type 可以是关键字 void。 函数名称:这是函数的实际名称(function_name)。函数名参数列表一起构成了函数签名。...---- 数组 在 C 中要声明一个数组,需要指定元素的类型元素的数量: type arrayName [ arraySize ]; //这里的大小也可以不设置,能设置就设置 示例: double...*/ printf( "平均值是: %f ", avg ); return 0; } ---- 由于还没有涉及到指针,有些操作也不太方便现在写。...接收输入类型:0(无所谓)、1(仅数字)、2(仅英文) isplainText:是否明文输出:0是1否 */ { char ch; int iLen = 0; while(1) { ch = getch

41210

用c语言编写一个学生成绩管理系统_c语言成绩查询系统编程

如果没有先搭好框架,而是直接一上手就去写代码的话,写着写着就会有种无从下手的感觉,就像你要做一道编程题目一样,首先要做的肯定是去读题目,看题目想要让我们干什么,然后才会去写代码。...其次,最好是实现一个功能就测试一个,因为这样比较方便调试,出现bug的时候自己先思考,然后再去查找对应的知识点,一定要自己多思考,这样才会使自己的理解记忆更加深刻 最后,在写管理系统的时候会出现很多...我的管理系统分了三个端口:教师端,学生端,管理员端 首先,这是登录界面 教师端功能界面 学生端界面 学生端功能界面 管理员功能界面 详情 每个端口进行登录时都会进行账号密码验证...printf("\t请键入任意键返回上一层\n") ; getch() ; break ; case 2 :...a[--i] = '\0' ; } else { a[i++] = ch ; putchar

4.7K30

getchar的使用

=’\n’); (2)用getche()或getch()代替getchar(),其作用是从键盘读入一个字符(不用按回车),注意要包含头文件 4....实际上是 输入设备->内存缓冲区->程序getchar 你按的键是放进缓冲区了,然后供程序getchar 你有没有试过按住很多键然后等一会儿会滴滴滴滴响,就是缓冲区满了,你后头按的键没有存进缓冲区...键盘输入的字符都存到缓冲区内,一旦键入回车,getchar就进入缓冲区读取字符,一次只返回第一个字符作为getchar函数的值,如果 有循环或足够多的getchar语句,就会依次读出缓冲区内的所有字符直到...因为当我们从键盘输入字符‘1’,‘2’,并按下回车后,我们的输入被放入了输入缓冲区,这个时候getchar()会从缓冲区中读取我们刚才的输入,一次只读一个字符,所以字符1就被拿出来了,赋值给了c,然后putchar...它真正的运行过程应该是这样的:还记得我们刚才说过的东西吗,getchar()会从输入缓冲区去读取内容,也就是说我们把所有的内容都输入完成并且按下了Enter键后,我们的输入才被送进去了输入缓冲区,这个时候,while循环才开始工作

65050

你还没有准备好机器人一起工作吗?

导读:上一期我们以电视为例,介绍了人工智能AI对我们日常生活娱乐的影响,今天我们来了解一下,我们应该如何与机器人和谐的相处与工作(文末更多往期译文推荐) 人类正在进入一个让人焦虑的时代:无所不能的智能机器人时代...我们是可以与机器人完美相处的,并且机器人会给我们的工作和生活带来极大的便利。我发誓。特别是在智能化快速发展的现在,我们只需要做出一些努力改变,就可以让机器人为绝大多数人类服务。...机器人制造商不仅需要设计制造机器人,更为重要的是,他们需要制造生产出符合人类期望的机器人帮手。...研究表明,人与机器人的交互往往是期待机器人能够帮助人类做某些事情,同时可以与人类正常交流,了解人类的需求,及时调整工作内容等。...机器人当然没有类似人类身体感知的能力。但它们非常强大,可以不间断的进行重复性工作。但是,现在的机器人有些不太方便操控,需要操控者具备一定的技能。

71880
领券