gpt4 book ai didi

c++ - 可变字符串比较

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:38:28 25 4
gpt4 key购买 nike

我正在使用一些旧代码(碰巧是一个文字游戏)并想替换模式

strcasecmp(variable, "something") == 0 || strcasecmp(variable, "something else") == 0

有更好的东西,比如

in_list(variable, "something", "something else")

我认为可变参数函数比较合适。但是,当我查看联机帮助页时,我发现无法判断您何时用完参数(当您导致未定义行为时调用 va_arg)。那么我该如何处理呢?

也许有一些方法可以绕过这个限制。也许我可以在列表的末尾 #define 某种标记,这样我就可以检查它,尽管它看起来并不优雅。我想我可以将它替换为具有 1、2、... 参数的一系列宏,直到达到某个合理的限制,尽管这感觉像是 hack。

执行此操作的正确方法是什么?假设我不愿意重写程序以使用 string 类型并且我被 char* 困住了。

最佳答案

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

in_list(variable, {"something", "something else", "yet a third thing"});

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

#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;
}

这可以用 g++ 4.7.0 干净地编译,并产生预期的输出:

true
false

是的,如果没有理由不这样做,std::set 将是手头工作的合理选择。就您对 char *std::string 的关注而言:std::string 支持从 char * 的隐式转换,因此您可以将 char * 传递给函数(正如我在上面所做的那样),它会自动转换为 std::string。换句话说,(大多数)其他代码可以只传递 char *,而不用担心此代码将其视为 std::string 的次要细节。

关于c++ - 可变字符串比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10545021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com