无限循环中的c壳
我正在创建一个c shell,遇到了一个问题,我被困在一个无限循环中。输入/输出示例:我键入“ls-a”,命令的结果会不断地反复打印到控制台。如果我删除标签(我调用了无限循环中的c壳,c,shell,infinite-loop,C,Shell,Infinite Loop,我正在创建一个c shell,遇到了一个问题,我被困在一个无限循环中。输入/输出示例:我键入“ls-a”,命令的结果会不断地反复打印到控制台。如果我删除标签(我调用了start:)和goto语句,那么我的shell将只执行命令,然后完全退出shell程序。我也尝试过使用while(1)和for(;;)循环,但它们产生的输出与我目前得到的相同。我怎样才能在这里实现我的目标?感谢所有的帮助。请参阅下面的代码 int main( int argc, const char* argv[]){ cha
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读取stdin中的行并解析它们。问题是您没有检查scanf
函数的返回值。首先,它扫描所有小于或等于\n
字符的内容并执行代码。但是\n
字符仍保留在缓冲区中;所以下一步scanf
将什么也不做,将旧的值保持完整。这就是为什么它一遍又一遍地执行同一个命令。检查以下代码:
#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;
}
#包括
#包括
内部主(空){
全字符[1024];
strcpy(完整,“覆盖整个字符串”);
scanf(“%1023[^\t\n]”,整条);
printf(“%s\n”,整);
strcpy(完整,“覆盖整个字符串”);
scanf(“%1023[^\t\n]”,整条);
printf(“%s\n”,整);
返回0;
}
它不允许您输入两行。第二个scanf
将失败,留下旧的“覆盖”值
使用fgets
函数获取整行输入。再次检查第一个while循环。if(third=“”)
-这是两个错误:(1)无条件地将空字符串分配给third
。因为空字符串不是NULL
,所以该条件为false。(2) 无法将字符串与常规比较进行比较,==
。若要测试字符串是否为空,请执行if(*third=='\0')
@M Oehm此操作运行良好,不会出错。我正在检查它是否为空,如果为空则设置为空。请信任M Oehm。他们在代码的这一部分是对的。@peggy无视清楚他们在谈论什么的人的建议是个坏主意。若你们已经知道了所有的问题,为什么还要把你们的问题贴在这里?你们对如何解决这个问题有什么建议吗?@peggy,正如我写的,一次读一行输入。fgets是你的朋友。如果要使用scanf,请始终检查返回值。