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