C/C++中peek函数的原理及应用

C++中的peek函数

  该调用形式为cin.peek() 其返回值是一个char型的字符,其返回值是指针指向的当前字符,但它只是观测,指针仍停留在当前位置,并不后移。如果要访问的字符是文件结束符,则函数值是EOF(-1)。

  其功能是从输入流中读取一个字符 但该字符并未从输入流中删除  若把输入流比作一个 栈类 那么这里的peek函数就相当于栈的成员函数front 而如果cin.get()则相当于栈的成员函数pop。

  下面这段代码能帮助您更清晰地理解peek函数

 1 /* istream peek */
 2 #include <iostream>
 3 using namespace std;
 4 int main () 
 5 {
 6     char c;
 7     int n;
 8     char str[256];
 9     cout << "Enter a number or a word: ";
10     c=cin.peek();
11     if ( (c >= '0') && (c <= '9') )
12     {
13         cin >> n;
14         cout << "You have entered number " << n << endl;
15     }
16     else
17     {
18         cin >> str;
19         cout << " You have entered word " << str << endl;
20     }
21     return 0;
22 }

C中的peek函数(自己写的)

 1 char peek_char;
 2 
 3 static char peek()
 4 {
 5     return peek_char;
 6 }
 7 
 8 static void * __Peek_loop_func(void *pInputArg)
 9 {
10     char tmp_char;
11     while(1)
12     {
13         if(tmp_char=getchar())
14         {            
15             if((tmp_char!='\r')&&(tmp_char!='\n')&&(tmp_char!=0x0a))
16             {
17                 peek_char=tmp_char;
18                 printf("Input Char === [%c] \n",peek_char);    
19 
20                 if(peek_char=='q')
21                 {
22                     printf("Jmp out from serial == 2 \n");
23                     exit(1);
24                 }
25             }
26         }
27         usleep(1000*10);
28     }
29 }
30 
31 // 下面的代码放在主程序中,用来创建检测输入的线程.
32 
33 pthread_t tPeekThreadHandle;
34 pthread_create(&tPeekThreadHandle, NULL, &__Peek_loop_func, NULL);

如何在主程序运行的同时检测串口的输入,比如输入"q",退出函数。原理就是创建一个新线程,来接收串口的输入,如果输入的第一字符为‘q’ 则退出程序,其实在退出的时候,我们也可以再捕获一下。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端杂货铺

Global eval. What are the options?

David Flanagan最近写了一个关于全局eval的简单表达式,可以用一行式子表示: var geval = this.execScript || ev...

27760
来自专栏我的博客

php使用elasticsearch

1.引入包 composer require elasticsearch/elasticsearch 2.DEMO参考 <?php require_once ...

45570
来自专栏Python小屋

详解Python变量作用域

本文暂时不讨论类定义中的变量(成员)作用域,改天可能会单独成文介绍。 变量作用域总起来说可以这么理解:1)在函数内如果只引用某个变量的值而没有为其赋新值,该变量...

52280
来自专栏架构师小秘圈

shell极简教程(二)

一,题记 不懂shell的程序员不是好程序员,学习shell是为了自动化,使用自动化可以非常有效的提高工作效率。没有一个大公司不要求linux的基本技能的,只是...

40770
来自专栏我是攻城师

重温java代理模式

29590
来自专栏Java帮帮-微信公众号-技术文章全总结

Java面试系列2

六、&和&&的区别? &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and) 七、swtich是否能作用在byte上,是否能作用在long上,是否...

30360
来自专栏数据科学

redis流计算

使用了tornado的异步和streamz的流处理两个库,需要redis 5.0以上版本

25550
来自专栏向治洪

Android热补丁技术—dexposed原理简析(手机淘宝采用方案)

上篇文章《Android无线开发的几种常用技术》我们介绍了几种android移动应用开发中的常用技术,其中的热补丁正在被越来越多的开发团队所使用,它涉及到da...

29060
来自专栏微信公众号:Java团长

Java面试宝典

允许不同类对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用).主要有以下优点:

25020
来自专栏专注 Java 基础分享

深入理解Struts2----类型转换

     之前的一系列文章主要介绍了有关Struts2的一些基本用法和部分的简单原理,但是始终没有介绍有关拦截器的相关内容,从本篇开始我们将从另一个角度去深入理...

23690

扫码关注云+社区

领取腾讯云代金券