c shell陷入无限循环

时间:2016-02-28 20:16:43

标签: c shell infinite-loop

我正在创建一个c shell并遇到一个问题,我陷入无限循环。示例输入/输出:我输入“ls -a”并且命令的结果不断地反复打印到控制台。如果我删除标签(我称为start:)和goto语句,那么我的shell将只执行命令然后完全退出shell程序。我也尝试使用while(1)和for(;;)循环,但这些导致了我目前得到的相同输出。我怎样才能在这里实现我的目标?所有的帮助表示赞赏。见下面的代码。

int main( int argc, const char* argv[]){
  char whole[1024];
  int cmdCount = 1;

 start:
  scanf("%1023[^\t\n]", whole);
  //....
 goto start;

 return 0;
}

2 个答案:

答案 0 :(得分:3)

您的scanf会读取除换行符或制表符以外的所有内容。你永远不会检查它是否有任何内容。所以它第一次成功时,下一次有换行符,所以它无法读取任何内容。您不检查这个,只使用包含先前读取的行的缓冲区。这将导致相同的命令反复运行。

而是从stdin读取行并解析它们,不要使用scanf读取。

答案 1 :(得分:0)

问题是您没有检查scanf函数的值的返回值。首先,它扫描所有字符,直到\n字符并执行您的代码。但\n字符仍留在缓冲区中;因此,下一个scanf将不执行任何操作,保留旧的whole值。这就是为什么它一遍又一遍地执行相同的命令。请检查以下代码:

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

int main(void) {
    char whole[1024];
    strcpy(whole, "override whole string");
    scanf("%1023[^\t\n]", whole);
    printf("%s\n", whole);
    strcpy(whole, "override whole string");
    scanf("%1023[^\t\n]", whole);
    printf("%s\n", whole);

    return 0;
}

它不允许您输入两行。第二个scanf将失败,留下旧的“被覆盖”的价值。

使用fgets函数获取整行输入。