单个 scanf 命令是否可以接受一个或两个输入?

问题描述 投票:0回答:1
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
仍然需要第二个输入。

c scanf
1个回答
0
投票

除非真正限制输入的语法,否则很难让交互式命令行工作并进行测试。然而,这是一个非常常见的问题。更稳健且压力更小的方法是使用“解析器生成器”,将大部分测试卸载到生成器。例如,可以使用 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

    

© www.soinside.com 2019 - 2024. All rights reserved.