如何清理c中的缓冲区?

时间:2012-05-23 09:18:28

标签: c linux bash buffer

我正在进行大量迭代以模拟bash命令(Homework)。

代码效果很好,但问题是在输入几次迭代后,程序 开始有一些缓冲问题。我怀疑它与所有\n点击Enter有关。

例如,代码如下所示:

#define BUFFER 4096
#define RUN_FOREVER 1
#define ERROR_SIGN -1
#define TRUE 1
#define FALSE 0

int main(int argc , char * argv[] )
{
    char input[BUFFER];

    //Get always a command line from the user.
    while(RUN_FOREVER)

    {

        if (isatty(0))
        {
            // input is from terminal
            // need to put something here 
        }

        char **separatedFormAmpersand ;

        int ampersandsCtr = 0, k=0,r=0;
        char *stringBeforeAmpersand = NULL;

        printf("$ ");


        memset(input, '\0', BUFFER);

         char ch;

        scanf("%[^\n]",input);
        scanf("%c",&ch);

        if(0 == strcmp(input, "exit"))
            break;

        //Separate the command according to the "&".
        stringBeforeAmpersand = strtok( input, "&");
... // more code (quite a lot , frankly) 

现在,如果用户点击以下输入:

ls Debug/ | grep r
ls >> file.jer & ls & ls & ls
ls >> file.jer

一个接一个,当我点击输入数ls时,代码无法识别3命令。

如果我在一次代码中输入每个输入,一切都很完美。

任何想法如何清理缓冲区?也许fflush

谢谢!

2 个答案:

答案 0 :(得分:1)

要阅读一行输入,请使用:

fgets(buffer, sizeof buffer, stdin);

检查失败的返回值。请注意,它会包含换行符,因此您可能需要添加代码以将其删除。

答案 1 :(得分:1)

在您从代码中说出任何内容之前,

刷新标准输出显然是一件好事。

我假设您的scanf对具有以下目标:一个将抓住一行,第二个将“跳过\ n”字符。您可以稍后使用getc(),顺便说一句。奇怪的是scanf()本身是否会为您读取\n字符。

在GNU方式中,scanf()可能会优于fgets(),因为%a[...]修饰符可以让您摆脱“缓冲区大小”限制并让库{{1}适合你的缓冲区。

曾经想过用strace调用你的程序来跟踪输入的读取吗?