网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
11月26日
漏签
0
天
c4droid吧
关注:
42,869
贴子:
262,769
看贴
图片
吧主推荐
游戏
12
回复贴,共
1
页
<<返回c4droid吧
>0< 加载中...
找到因添加了延时函数导致没有输出的原因了。
只看楼主
收藏
回复
tgxx501
高手寂寞
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
输出输入都有缓冲的,你不刷它,不满或没收到\n的时候是不会输出的。
终于知道问题所在了,困扰了一晚上。
作为一个入门不到3天的新手来说,这太无语了。
tgxx501
高手寂寞
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
解决方法:在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。
tgxx501
高手寂寞
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
又找到几种清空缓冲区的方法
1、
方法一:
fflush(stdin);
fflush(stdin)在VC上可以使用,但是其他编译器不能保证对fflush的实现。
2、
方法二:
setbuf(stdin, NULL);
setbuf(stdin, NULL);是使stdin输入流由默认缓冲区转为无缓冲区。但缓冲区没有了。
3、
方法三:
char ch;while((ch = getchar()) != '\n' && ch != EOF);
这种方法是最好的方法,因为它使用的是C语言的基本语法,在什么情况都是支持的
2002a1116
孤独求败
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
有实在不会的可以提问,简单的多。
这个火星了,不过从来没人总结,做的不错
丿小夕ve
高手寂寞
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
多线程getch();
互斥锁个变量通信
wuli
美女
大哲
13
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
一般书上不是有讲这个么?。。。。
丿小夕ve
高手寂寞
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
#include"conio.h"
#include <pthread.h>
bool run = true;
bool sendEvent = false, inputEvent = false;
// 全局变量用于线程间通信
pthread_t eid;
// 线程
char inchar = 0, inbuff[100];
//缓存
int inlen = 0;
// 输入的字符串长度
inline void clearBuff() {
// 清空
for (int i = 0; i < inlen; i++) {
inbuff[i] = 0;
}
inlen = 0;
}
void *event(void *arg) {
while (run) {
switch (inchar = getch()) {
case (10):
//回车
if (inlen > 0) {
sendEvent = true;
}
break;
case (127):
if (inlen <= 0) {
clearBuff();
} else {
if (inbuff[inlen - 1] < 127) {
inbuff[--inlen] = 0;
} else {
inbuff[inlen--] = 0;
inbuff[inlen--] = 0;
inbuff[inlen--] = 0;
inbuff[inlen] = 0;
}
}
break;
default:
if (inchar >= 127) {
// 中文
inbuff[inlen++] = inchar;
inbuff[inlen++] = getch();
inbuff[inlen++] = getch();
} else {
// 英文
inbuff[inlen++] = inchar;
}
}
inbuff[inlen] = 0;
inputEvent = true;
}
}
int main() {
printf("\E[?25l");
pthread_create(&eid, NULL, event, NULL);
while (run) {
if (sendEvent == true) {
//按了回车键
sendEvent = false;
run=false;
}
if (inputEvent== true) {
inputEvent = false;
printf("\e[50D\e[K\e[4;1;33m%s\e[36m|\e[0m", inbuff);
}
}
clrscr();
printf("输入的字符:%s",inbuff);
pthread_join(eid, NULL);
printf("退出\n");
}
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示