sscanf - 不同数量的格式参数?

ryy*_*yst 5 c scanf

在我的程序中,我用来sscanf检查字符串是否具有给定的格式。为此,我在格式字符串中提供参数数量,并检查sscanf在解析输入时是否返回相同的数字。

作为原始解析器的一部分,我想检查字符串是否与多种格式之一匹配。该sscanf函数是可变参数的,那么如何处理需要传递的不同数量的参数呢?

目前,我只是向函数传递大量参数(例如 50 个),并且只是希望格式字符串不包含更多参数。

有没有更好的方法来做到这一点?

Dav*_*ave 4

你确实需要比 更重的东西scanf。你必须告诉 scanf你的输入是什么格式;它无法自行解决任何问题。

如果您可以访问 POSIX,看看regex.h它可能就是您需要的一切。

否则,您将陷入自己的困境。如果格式相当复杂,则 和 很好,但除此之外,lex或( + ) 可能是正确的选择。yaccstrtokgetcharswitch

编辑: 由于您可以使用 POSIX,因此这里有一个简单的示例,说明如何从 c 中的正则表达式中提取数据。(为简洁起见,排除了错误检查。)

char txt[] = "232343341235898dfsfgs/.f";
regex_t reg;
regmatch_t refs[MAX_REFS]; //as in, the maximum number of data you want to extract
regcomp(&reg, "3433\\([0-5]*\\).*", 0); //replace 0 with REG_EXTENDED if desired
regexec(&reg, txt, MAX_REFS, refs, 0);
regfree(&reg);

txt[refs[0].rm_eo+1] = '\0';
int n = atoi(txt+refs[0].rm_so);
printf("%d\n", n);
Run Code Online (Sandbox Code Playgroud)

印刷

41235
Run Code Online (Sandbox Code Playgroud)