i was wrong!
虽然setbuf可以让程序自己管理缓冲,但是像getchar,gets这些标准IO函数还是要通过隐藏的stdin进行操作,而stdin是啥呢?还是一个FILE*,而FILE*自己内部有很多东西比如记录下一个字符的位置,有没有读尽缓存,因此直接通过memset去清除缓存还是很野蛮的动作,比较危险,但是文章也还有点价值,我实在是不舍得删,就先写一段放在这里吧
 
#include <stdio.h>
#include <stdlib.h> int main(int argc, char *argv[])
{
char buffer[] = {}; gets(buffer);
printf("%s\n",buffer);
system("PAUSE");
return ;
}

一般来说,我们从命令行输入文本之后按回车,输入被输入进程序的输入缓存,gets可以读出来,但是如果我们想输入多行,让gets分几次读出,就需要手工输入一个换行符,在输入里写入\n是不可以的,在windows下可以从键盘输入:按住alt, 输入小键盘上的数字 10 经试验,是可以的

我一个朋友的特殊需求,要求一旦通过gets读取输入后,下次就要求用户重新输入

#include <stdio.h>
#include <stdlib.h> int main(int argc, char *argv[])
{
char buffer[] = {};
char stdin_buffer[] = {}; setbuf(stdin,stdin_buffer); //程序自己管理stdin内存
gets(buffer);
printf("%s\n",buffer); memset(stdin_buffer,,); //手工清内存 gets(buffer);
printf("%s\n",buffer); //读取一行输入 gets(buffer);
printf("%s\n",buffer); // 读取第二行输入,如果输入两行的情况下,不需要提示用户再次输入
// 但是如果程序手工清理了缓存,程序会要求用户输入 system("PAUSE");
return ;
}

貌似上面的程序看起来很没品,我重写了一个版本:

#include <stdio.h>
#include <stdlib.h> int main(int argc, char *argv[])
{
char buffer[] = {};
char stdin_buffer[] = {}; setbuf(stdin,stdin_buffer); //程序自己管理stdin内存 for(;;)
{
gets(buffer);
if(strcmp(buffer,"q")==)
{
break; // 输入q退出循环
}
else
{
//从用户的输入里读且只读一行。然后清空缓存,让用户重新输入
printf("type: %s\n",buffer);
memset(stdin_buffer,,);
}
} system("PAUSE");
return ;
}

gets和从键盘输入换行符的更多相关文章

  1. c++string 输入换行符

    string 一次只能输入一行,不含换行符.可以自己添加换行符 和输入行数.例如:#include <iostream>#include <string>using names ...

  2. 在Javascript弹出窗口中输入换行符

    private void showMessage(string strMsg) { Page.RegisterStartupScript("scriptStr", "&l ...

  3. excel 批量替换换行符

    在excel批量替换换行符操作步骤: 全选需要查找换行符的范围 CTRL+H调出查找和替换 在查找内容内输入"ctrl+enter"两个组合键 点击查找全部即可. 在excel中输 ...

  4. C#中插入换行符

    要让一个Windows Form的TextBox显示多行文本就得把它的Multiline属性设置为true. 这个大家都知道,可是当你要在代码中为Text属性设置多行文本的时候可能会遇到点麻烦:) 你 ...

  5. jstl fn:replace替换换行符

    textarea输入换行符后应该是'\n',在div中展示时替换成'<br>' 找到一种方法用jsp标签 jstl fn:replace方法 使用fn:replace方法之前 先要把jst ...

  6. 使用nextInt()等接受输入时必须注意换行符的输入

    参考http://stackoverflow.com/questions/19331426/for-loop-does-not-iterate-the-way-i-want 见以下代码: packag ...

  7. Kettle文本文件输出和输入控件使用中,换行符导致的问题处理

    1.如下图通过输入控件从数据库读取数据然后生成TXT文本文件,TXT文件生成原则是每一条数据生成一行数据,第二条数据换行保存 2.如下图所示,使用文本文件输入控件读入上图生成的文件,文件读入原则是按行 ...

  8. fgets()函数读取键盘,去掉换行符或丢弃多余的字符

    在上一遍随笔中,我们知道可以用fgets()函数来代替不安全的gets()函数.fgets函数中的第二个参数限制了读取的个数. 上篇文章也提到,fgets是会读取回车换行符的.有时候我们并不希望在字符 ...

  9. 将html中的br换行符转换为文本输入中的换行符(转)

    PHP中的有个非常好的函数:nl2br(),将文本框中的换行转换为HTML页面的<br />,但是如何实现将html中的<br />换行符转换为文本框中的换行符呢?下面这几个方 ...

随机推荐

  1. 二叉树后序遍历的非递归算法(C语言)

    首先非常感谢‘hicjiajia’的博文:二叉树后序遍历(非递归) 这篇随笔开启我的博客进程,成为万千程序员中的一员,坚持走到更远! 折磨了我一下午的后序遍历中午得到解决,关键在于标记右子树是否被访问 ...

  2. Java枚举7常见种用法

    DK1.5引入了新的类型——枚举.在Java中它虽然算个“小”功能,却给我的开发带来了“大”方便. 方法/步骤 用法一:常量 在JDK1.5之前,我们定义常量都是:publicstaticfianl. ...

  3. python游戏编程——跟13岁儿童学编程

    python爬虫基本告一段落,琢磨搞点其他的,正好在网上看到一个帖子,一个外国13岁小朋友用python写的下棋程序,内容详细,也有意思,拿来练手. 13岁啊.. 我这年纪还在敲 dir啥的吧 想到原 ...

  4. springMVC学习(1)

    spring mvc的位置: springMVC只是spring的一个模块:   第一步:发起请求到前端控制器(DispatcherServlet) 第二步:DispatcherServlet请求Ha ...

  5. Python进阶(面向对象编程基础)(一)

    鉴于昨天被类和函数折腾得晕头转向,今特把类的知识翻出来温习. 1.定义类并创建实力对象 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ ...

  6. squid 代理服务器安装配置

    ubuntu16.04 安装squid代理服务器配置 本文参考 http://www.cnblogs.com/newflypig/archive/2012/09/28/2862000.html 1,删 ...

  7. css的小demo

    demo1 一个高度随宽度变化的正方形   (缩小屏幕试试) 原理:margin和padding如果是用百分比设置,则是以父元素的宽度的百分比设置的. .Square{ display: inline ...

  8. Matlab生成二类线性可分数据

    %% 生成二类线性可分数据 function [feature, category]=generate_sample(step,error) aa=3; %斜率 bb=3; %截距 b1=1; rr ...

  9. php中socket的使用 方法简介

    一.开启socket phpinfo();查看是否开启了socket扩展,否则在php.ini中开启. 二.服务器端代码的写法 <?php error_reporting(E_ALL); set ...

  10. MVC实现类似QQ的网页聊天功能-Ajax(上)

    说到QQ聊天,程序员首先想到的就是如何实现长连接,及时的接收并回馈信息.那么首先想到的就是Ajax,Ajax的运行机制是通过XMLHttpRequest向服务器发出异步请求,并接受数据,这样就可以实现 ...