2016-02-28 59 views
1

我正在创建一个c壳,并有一个问题,我卡在一个无限循环。示例输入/输出:我输入“ls -a”,命令的结果不断地反复打印到控制台。如果我删除标签(我称为start:)和goto语句,那么我的shell将执行该命令,然后完全退出shell程序。我也尝试使用while(1)和for(;;)循环,但这些结果与我目前得到的输出相同。我怎样才能在这里完成我的目标?所有的帮助表示赞赏。看下面的代码。c壳卡在无限循环

int main(int argc, const char* argv[]){ 
    char whole[1024]; 
    int cmdCount = 1; 

start: 
    scanf("%1023[^\t\n]", whole); 
    //.... 
goto start; 

return 0; 
} 
+0

仔细检查你的第一个while循环。 – Annabelle

+5

'if(third =“”)' - 同时出现两个错误:(1)您无条件地将一个空字符串分配给'third'。由于空字符串不是“NULL”,所以共同作废是错误的。 (2)你不能比较字符串和常规比较,'=='。要测试一个字符串是否为空,请执行'if(* third =='\ 0')'。 –

+0

@M Oehm这运行良好,并没有错误。我正在检查它是否为空,如果它为空,则设置为空 – GregH

回答

3

您的scanf将读取除换行符或制表符以外的所有内容。你从不检查它是否读取任何内容。所以第一次成功时,下一次有新行,所以它不能读取任何东西。你不检查这个,只是使用包含以前读取的行的缓冲区。这将导致相同的命令一遍又一遍地运行。

宁可从stdin读取行并解析它们,请勿用scanf阅读。

+0

你有建议如何解决这个问题吗? – GregH

+0

@peggy正如我写的,一次读取输入行。 fgets是你的朋友。如果你想使用scanf,总是检查返回值。 –

0

问题是你没有检查你的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; 
} 

它不允许您输入两行。第二scanf只会失败,留下旧的“重写”价值。使用fgets函数获取整行输入。