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
函数获取整行输入。
我正在创建一个 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
函数获取整行输入。