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. Android中的手势

    Android对两种手势行为提供了支持:1.对于第一种手势行为而言,Android提供了手势检测,并为手势检测提供了相应的监听器.2.对于第二种手势行为,Android允许开发者添加手势,并提供了相应 ...

  2. JavaScript 中的非真值

    False values 下面这些值将被计算出 false (also known as Falsy values): false undefined null 0 NaN 空字符串 ("& ...

  3. poj2114 Boatherds

    Description Boatherds Inc. is a sailing company operating in the country of Trabantustan and offerin ...

  4. NCPC 2015 - Problem A - Adjoin the Networks

    题目链接 : http://codeforces.com/gym/100781/attachments 题意 : 有n个编号为0-n-1的点, 给出目前已经有的边(最多n-1条), 问如何添加最少的边 ...

  5. GF(2^8)乘法

    最近在学AES,实现了一下伽罗瓦域(2^8)乘法. 至于什么是伽罗瓦域解释起来比较复杂,我也不一定能解释清楚,自行google.这里只是给出一个简单直观的实现. #include<iostrea ...

  6. weblogic 的应用 常见问题处理 db2 链接不上(转载)

    xingkaistart weblogic10之Failed to initialize the application 'wss-1-1' due to error weblogic. Weblog ...

  7. hdu 4277 USACO ORZ(dfs+剪枝)

    Problem Description Like everyone, cows enjoy variety. Their current fancy is new shapes for pasture ...

  8. Oracle_Q&A_03

    1.先导入SQL文件 执行语句查看表信息 select * from student;--学生信息--(stunum,stuname,classid)select * from class;--班级信 ...

  9. [实战]记一次PUT方法拿下网站shell

    第一次用方法拿shell,之前遇到的都是没有写入权限的. 站太辣鸡,纯粹练手,就不打码了. 此次实战会用到的HTTP请求方法: OPTIONS,PUT,MOVE/COPPY * 战前准备 0x01 什 ...

  10. URL中的空格字符如何编码

    URL encoding the space character: + or %20? 简单理解: ‘?’前的路径中的空格必须为’20%’ ‘?’后的参数中空格可以被编码成’+’(正常情况),然而有时 ...