我试图创建自己的简单命令行解释器(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....
答案 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()调用时遗留下来的一些偏执狂。