-1

我正在做很多迭代以模拟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

谢谢!

4

2 回答 2

1

要读取一行输入,请使用以下命令:

fgets(buffer, sizeof buffer, stdin);

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

于 2012-05-23T09:32:39.650 回答
1

在您从代码中分辨出任何内容之前,刷新标准输出显然是一件好事。

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

以其 GNU 方式,scanf()可能证明比fgets()这里更好,因为%a[...]修饰符可以让您摆脱“缓冲区大小”限制,并让库malloc()为您提供足够大小的缓冲区。

有没有想过用 strace 调用你的程序来跟踪输入的读取?

于 2012-05-23T09:40:06.907 回答