变体字符串比较

Cha*_*les 4 c++ variadic-functions

我正在使用一些旧代码(文本游戏,因为它发生)并想要替换模式

strcasecmp(variable, "something") == 0 || strcasecmp(variable, "something else") == 0
Run Code Online (Sandbox Code Playgroud)

有更好的东西,比如

in_list(variable, "something", "something else")
Run Code Online (Sandbox Code Playgroud)

我认为可变函数是合适的.但是,当我查看该联机帮助页时,我看到没有办法告诉您何时用完了参数(va_arg当您遇到未定义的行为时调用).那我怎么办呢?

也许有办法解决这个限制.也许我可以#define在列表末尾找到某种哨兵,所以我可以检查一下,虽然看起来不太优雅.我想我可以用一系列具有1,2,......的参数替换它,直到一些合理的限制,尽管这感觉就像一个黑客.

这样做的正确方法是什么?假设我不愿意重写程序以使用该string类型并且我坚持使用char*s.

Jer*_*fin 6

假设您可以使用C++ 11功能,我将使用该函数采用std::set支持初始化列表的集合类型(例如),因此您可以使用以下内容:

in_list(variable, {"something", "something else", "yet a third thing"});
Run Code Online (Sandbox Code Playgroud)

编辑:这是一个快速演示:

#include <string>
#include <set>
#include <iostream>

bool in_list(std::string const &value, std::set<std::string> const &list) {
    return list.find(value) != list.end();
}

int main(){
    std::cout << std::boolalpha << in_list("true", {"this", "is", "a", "true", "statement"}) << "\n";

    std::cout << in_list("false", {"this", "is", "a", "true", "statement"});
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这用g ++ 4.7.0完全编译,并产生预期的输出:

true
false
Run Code Online (Sandbox Code Playgroud)

是的,没有理由不这样做,std::set对于手头的工作来说是一个合理的选择.至于你对char *vs. 的关注std::string:std::string支持隐式转换char *,所以你可以传递char *给函数(正如我上面所做的那样),它将std::string自动转换为.换句话说,(大多数)其他代码只能通过char *,而不用担心此代码将其视为的细微细节std::string.

  • @Charles:请注意,虽然代码很简单,但它也可能很慢,因为它在调用函数时构造了一组数据.特别是如果你用与第二个参数相同的字符串集重复调用它,预先构建一个`set`可能要快得多,并且每次都要传递它. (3认同)