c shell 陷入死循环

c shell stuck in infinite loop

我正在创建一个 c shell 并遇到一个问题,我陷入了无限循环。示例 input/ouput:我键入 "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;
}

您的 scanf 将阅读除换行符或制表符之外的所有内容。您永远不会检查它是否读取任何内容。所以第一次成功,下一次有一个换行符,所以它什么也读不到。您不检查它而只使用包含先前读取的行的缓冲区。这将导致相同的命令一遍又一遍地成为 运行。

宁愿从标准输入中读取行并解析它们,不要使用 scanf 读取。

问题是您没有检查 scanf 函数的 return 值。首先,它会扫描最多 \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 将失败,留下旧的 "overridden" 值。

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