printf("Commands:\n");
printf(" add <word>: adds a new word to dictionary\n");
printf(" lookup <word>: searches for a word\n");
printf(" print: shows all words currently in the dictionary\n");
printf(" load <file_name>: reads in dictionary from a file\n");
printf(" save <file_name>: writes dictionary to a file\n");
printf(" check <file_name>: spell checks the specified file\n");
printf(" exit: exits the program\n");
while (t == 1) {
char command[MAX_CMD_LEN];
char word[MAX_CMD_LEN];
printf("spell_check> ");
int inputs = scanf("%s " " %s", command, word);
在上面的代码中,scanf 有没有一种方法可以区分我的命令在同一个 scanf 提示符中是否需要两个输入(例如:add word)或只需要一个输入(例如:exit)?正如所写,如果我执行退出等命令,
scanf
仍然需要第二个输入。
除非真正限制输入的语法,否则很难让交互式命令行工作并进行测试。然而,这是一个非常常见的问题。更稳健且压力更小的方法是使用“解析器生成器”,将大部分测试卸载到生成器。例如,可以使用 fgets
然后将字符串传递给
re2c生成器。
#include <stdio.h>
#include <assert.h>
static int lex(const char *s) {
const char *YYCURSOR = s, *YYMARKER, *yyt1, *yyt2;
const char *s0, *s1;
/*!re2c
re2c:yyfill:enable = 0;
re2c:define:YYCTYPE = char;
ws = [ \f\r\t\v];
nl = [\n];
word = [A-Za-z0-9']+; // pretty restricted
filename = [A-Za-z0-9_/.]+; // for starters... what about spaces?
ws* 'add' ws+ @s0 word @s1 ws* nl
{ printf("add <%.*s>\n", (int)(s1 - s0), s0); return 1; }
ws* 'lookup' ws+ @s0 word @s1 ws* nl
{ printf("lookup <%.*s>\n", (int)(s1 - s0), s0); return 1; }
ws* 'print' ws* nl
{ printf("print\n"); return 1; }
ws* 'load' ws+ @s0 filename @s1 ws* nl
{ printf("load <%.*s>\n", (int)(s1 - s0), s0); return 1; }
//...
* { return 0; }
*/
}
int main(void) {
printf("Commands:\n");
printf(" add <word>: adds a new word to dictionary\n");
/* ... */
printf(" exit: exits the program\n");
assert(!lex("add\n"));
assert(lex(" Add fds \n"));
assert(lex("lookup foo \n"));
assert(lex(" PRINt \n"));
assert(lex(" LoAd /arr.txt \n"));
//assert(lex(" SAVE foo/bar.txt \n"));
//assert(lex(" cHeck check.txt \n"));
//assert(lex(" eXiT \n"));
return 0;
}
这可能不合适,因为程序经历了预编译步骤
re2c
。