我正在进行大量迭代以模拟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
?
谢谢!
答案 0 :(得分:1)
要阅读一行输入,请使用:
fgets(buffer, sizeof buffer, stdin);
检查失败的返回值。请注意,它会包含换行符,因此您可能需要添加代码以将其删除。
答案 1 :(得分:1)
刷新标准输出显然是一件好事。
我假设您的scanf
对具有以下目标:一个将抓住一行,第二个将“跳过\ n”字符。您可以稍后使用getc()
,顺便说一句。奇怪的是scanf()本身是否会为您读取\n
字符。
在GNU方式中,scanf()
可能会优于fgets()
,因为%a[...]
修饰符可以让您摆脱“缓冲区大小”限制并让库{{1}适合你的缓冲区。
曾经想过用strace调用你的程序来跟踪输入的读取吗?