使用sscanf比较字符串,但忽略空格

时间:2017-07-14 19:40:34

标签: c scanf

对于命令行应用程序,我需要将输入字符串与命令模式进行比较。需要忽略空格。

此行应匹配输入字符串,如"放弃所有"和"放弃所有":

int rc = sscanf( input, "drop all");

但是什么表明这里有成功的比赛?

2 个答案:

答案 0 :(得分:6)

使用"%n"记录扫描停止的位置。

以格式添加空格,以便input中的WS需要忽略。

int n = -1;
sscanf( input, " drop all %n", &n);
//  v---- Did scanning reach the end of the format? 
//  |         v---- Was there additional text in `input`? 
if (n >= 0 && input[n] == '\0') Success();

答案 1 :(得分:2)

通常更好的方法是清理它然后使用脏数据,而不是处理脏数据。清理必须只发生一次,而脏数据每次必须使用时都会增加代码复杂性。该步骤通常称为“标准化”。在使用之前将输入规范化为规范形式。

通过修剪空格并执行其他任何必要的规范化(例如折叠和规范化内部空白)来清理输入。

您可以编写自己的修剪功能,但我建议您使用预先存在的功能,如Gnome Lib's g_strstrip()。 Gnome Lib带来了各种方便的功能。

#include <glib.h>

void normalize_cmd( char *str ) {
    g_strstrip(str);

    // Any other normalization you might want to do, like
    // folding multiple spaces or changing a hard tab to
    // a space.
}

然后,您可以在规范化输入上使用strcmp

// This isn't strictly necessary, but it's nice to keep a copy
// of the original around for error messages and such.
char *cmd = g_strdup(input);

normalize_cmd(cmd);

if ( strcmp(cmd, "drop all") == 0) {
    puts("yes");
}
else {
    puts("no");
}

预先设置所有规范化降低了必须使用该输入的所有下游代码的复杂性;他们不必继续重复关于脏数据的相同问题。通过将所有规范化放在一个地方,而不是分散在整个代码中,您确定它是一致的,并且可以一致地更新规范化方法。