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. MCS-51特殊功能寄存器(SPR)的C51定义

    MCS - 51单片机中,除了程序计数器PC和4组工作寄存器组外,其它所有的寄存器均为特殊功能寄存器(SFR),分散在片内RAM区的高128字节中,地址范围为80H~0FFH.SFR中有11个寄存器具 ...

  2. Activity的各种功能封装

    Activity全屏.隐藏系统标题栏.设置屏幕方向.Activity跳转等功能 /** * Copyright (C) 2012 TookitForAndroid Project * * Licens ...

  3. 普通的101键盘在Mac上的键位对应

    为了方便,搞了一个普通的101有线全键盘 + Magic TrackPad配Macbook.        然后发现了一个小问题,按键对应似乎不像我想的那么完美,F1~F12和Macbook不对应,于 ...

  4. 【转】s3c2440 按键驱动 — 字符设备

    原文网址:http://www.xuebuyuan.com/632893.html 主机:VM - redhat 9.0 开发板:FL2440,linux-2.6.12 arm-linux-gcc:3 ...

  5. java中文件操作的工具类

    代码: package com.lky.pojo; import java.io.BufferedReader; import java.io.BufferedWriter; import java. ...

  6. 数据库中的schema概念

    原文地址:http://blog.sina.com.cn/s/blog_7952e89001010jlj.html 数据库的初学者往往会对关系型数据库模式(schema).数据库(database). ...

  7. 控制反转(IOC)/依赖注入(DI)理解

    个人学习笔记,来自Acode. 1.术语 控制反转/反向控制,英文全称“Inversion of Control”,简称IoC. 依赖注入,英文全称“Dependency Injection”,简称D ...

  8. Python爬虫实战(一)

    今天,学习了爬虫的基础知识,尝试着写了本人的第一个小爬虫——爬取糗百上的热门段子.一开始自己做的是爬取1-35页,每页20条段子的作者.点赞数和内容,代码很简陋,贴在下面: #!/usr/bin/en ...

  9. Highcharts教程

    Highcharts特性: 兼容性 - 支持所有主流浏览器和移动平台(android.iOS等). 多设备 - 支持多种设备,如手持设备 iPhone/iPad.平板等 免费使用 - 开源免费 轻量 ...

  10. LF will be replaced by CRLF问题解决方法

    [GIT] warning: LF will be replaced by CRLF问题解决方法 开发环境: 操作系统: windows xp ruby 1.9.2 rails 3.1.3 git v ...