如果只输入用户输入,如何重新发出shell提示符?

时间:2013-11-27 11:06:10

标签: c shell fgets

我试图创建自己的简单命令行解释器(shell),如果唯一的用户输入是空格,我希望提示重复。基本上,如果用户按下return,我希望提示重复并等待下一个输入。我正在使用fgets来获取输入,并将其存储在char * commandBuffer中以便通过parse()方法进行解析。我原本想要检查argv(argc = 0)中是否有参数,但这只会导致光标移动到新行而不再打印提示。例如,如果我在提示符处输入“\ n \ n \ ncd”,则cd仍然起作用。我想尝试修复的另一个问题是,为了将在提示符下键入的内容发送到shell,用户必须按两次输入。这是我到目前为止的代码:

    for (;;) {
        printf("p2: ");
        fflush(stdout);


        /*---------FGETS PROMPT----------*/
        fgets(commandLine, STORAGE, stdin);
        ln = strlen(commandLine)-1;
        /* Removes trailing newline */
        if(commandLine[ln] == '\n')
            commandLine[ln] = '\0';
        /* ATTEMPT to repeat the prompt if only user input at prompt is enter*/
        if(commandLine[0] == '\0')
            continue;
 ....More shell code....

1 个答案:

答案 0 :(得分:0)

(由你来调试): 我总是做这样的事情来生存命令中出现的任何空白区域。如果在传入行的末尾得到\ r \ n \ 0或只有\ r \ 0,这也可以避免问题,这会导致代码片段出现问题。

char  *cl;
for ( cl = commandLine; *cl && isspace(*cl); cp++ )
{
    if ( cl == 0 )
        break;          // escape for ( cl = ...) to get back to outer for (;;)

    // if trimming trailing white space in the same style is important:
    int   ln;           // length of non-blank text
  {                     // limit scope of cl2
    char *cl2;
    for ( cl = strchr( cl, '\0' ); cl2 >= cl; cl2-- )
        if ( isspace(*cl2) )
             *cl2 = '\0';
  }
  ln = cl2 - cl + 1;    // we can quickly calculate 

    ... do the rest of your loop here using cP as your start of text
}

*cl && isspace(*cl)在历史时期遇到破坏的isspace()调用时遗留下来的一些偏执狂。