清除缓冲区标准输入

戴夫(P. Dave)

您好Stackoverflow社区,我对此代码有疑问:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define MAX_SIZE 50


int main()
{
    char *s = malloc(sizeof(char)*MAX_SIZE);
    do{
        int r = read(STDIN_FILENO, s, MAX_SIZE);
        if(r==-1) printf("error");
        else{
            write(STDERR_FILENO, s, MAX_SIZE);
        }
        while(getchar()!='\n');
    } while(strcmp(s,"end\n")!=0);
    free(s);
    return 0;
}

问题在于它会产生错误的输出,stdin不会在“ do while”的每次迭代中产生“干净”的结果。我知道我必须在Windows上使用,fflush(stdin)但在Internet上观看时,我发现此功能不适用于Linux。我使用linux,并且经常在互联网上观看,我看到很多人说解决方案while(getchar()!='\n);不是fflush(stdin),但是问题没有解决...您能解释一下为什么吗?

萨胡

我看到的问题:

  1. 您将错误的论据传递给write代替

    write(STDERR_FILENO, s, MAX_SIZE); 
    

    它应该是

    write(STDERR_FILENO, s, r); // Write the number of characters that were read
                                // not MAX_SIZE
    
  2. 跳到最后一行的策略还没有被深思熟虑。你有:

    int r = read(STDIN_FILENO, s, MAX_SIZE);
    if(r==-1) printf("error");
    else{
        write(STDERR_FILENO, s, MAX_SIZE);
    }
    while(getchar()!='\n');
    

    首先,read遇到换行符时不会停止阅读。它将读取最多MAX_SIZE字符。在此过程中,它将占用尽可能多的换行符。您需要做的是fgets()代替使用

    char* cp = fgets(s, MAX_SIZE, stdin);
    if ( cp == NULL )
    {
       // If fgets fails, you probably reached the end of the file.
       break;
    }
    
    fprintf(stderr, "%s", s);
    
  3. 线

    while(strcmp(s,"end\n")!=0);
    

    如果您用来read从文件中读取数据,将导致不确定的行为,因为read它不会自动向中添加终止的空字符s使用fgets可以避免该问题。

另外,由于您知道编译时数组的大小,因此可以使用:

char s[MAX_SIZE];

而不是malloc在运行时分配内存。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python:清除标准输入缓冲区

来自分类Dev

为什么“行缓冲区标准输出以确保自动原子地写行”

来自分类Dev

C程序中的非规范终端模式缓冲区标准输出

来自分类Dev

检查cin输入,清除输入缓冲区

来自分类Dev

getch()和getchar()清除输入缓冲区的用法的区别?

来自分类Dev

在C中的fgets()之后清除输入缓冲区

来自分类Dev

scanf读取后输入缓冲区是否被清除?

来自分类Dev

读取c中的输入后如何清除缓冲区?

来自分类Dev

标准输入流 (pubsetbuf) 使用的内部缓冲区

来自分类Dev

清除键盘缓冲区

来自分类Dev

Linux:python:在raw_input()之前清除输入缓冲区

来自分类Dev

在另一个输入请求之前清除cin缓冲区,c ++

来自分类Dev

清除键盘缓冲区或阻止输入(C#控制台)

来自分类Dev

在 C++ 中清除空输入缓冲区的安全操作

来自分类Dev

快速将标准输入快速读入缓冲区,无需检查

来自分类Dev

如何清除ReplaySubject上的缓冲区?

来自分类Dev

清除cout缓冲区(C ++)

来自分类Dev

Python中的Memset(),清除缓冲区

来自分类Dev

何时清除顶点缓冲区对象

来自分类Dev

强制在scanf中清除缓冲区

来自分类Dev

清除MIDI输出缓冲区

来自分类Dev

Python中的Memset(),清除缓冲区

来自分类Dev

何时清除顶点缓冲区对象

来自分类Dev

如何清除Neovim缓冲区

来自分类Dev

Tmux,禁用缓冲区清除功能

来自分类Dev

增加Python的标准缓冲区大小

来自分类Dev

我如何正确地从标准输入中读取带有缓冲区的输入而不会截断任何单词?

来自分类Dev

我如何正确地从标准输入中读取带有缓冲区的输入而不会截断任何单词?

来自分类Dev

阅读前清除标准输入

Related 相关文章

热门标签

归档