无限循环中的c壳

无限循环中的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

我正在创建一个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;
}

您的
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,请始终检查返回值。