zoukankan      html  css  js  c++  java
  • gets和从键盘输入换行符

    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[1024] = {0};
      
      gets(buffer);
      printf("%s
    ",buffer);
      system("PAUSE");    
      return 0;
    }

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

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

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

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

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
      char buffer[1024] = {0};
      char stdin_buffer[1024] = {0};
      
      setbuf(stdin,stdin_buffer); //程序自己管理stdin内存 
      
      for(;;)
      {
            gets(buffer);
            if(strcmp(buffer,"q")==0)
            {
               break; // 输入q退出循环            
            }
            else
            {
                //从用户的输入里读且只读一行。然后清空缓存,让用户重新输入 
                printf("type: %s
    ",buffer); 
                memset(stdin_buffer,0,1024); 
            }
      }
      
      system("PAUSE");
      return 0;
    }
  • 相关阅读:
    WPF的模版
    AvalonDock结合MVVM模式的应用
    A Diagram Designer
    WPF Canvas小例子
    WPF ListView的使用及Linq to XML练习
    httpclient发送接受请求
    json序列化以及反序列化存在多个对象时候的处理
    json序列化
    wpf数据绑定
    wpf之WrapPanel与StackPanel
  • 原文地址:https://www.cnblogs.com/code-style/p/3305930.html
Copyright © 2011-2022 走看看