在我的编程课程中,我们目前有一个项目要求我们在程序中加入参数。然后,我需要能够检查其中一个参数,以查看传递给程序的值,以便我可以选择适合该程序的行为。在以前的家庭作业中,我使用以下代码使用cstring库中包含的strcmp函数执行此操作:
int main(int argc, char *argv[]) {
if (strcmp(argv[1], "yes") == 0) {
// do this code
} else if (strcmp(argv[1], "no") == 0) {
// do this code
}
}
但是,出于某种原因,我们不允许在此项目中使用cstring库。我怎么能这样做?
答案 0 :(得分:5)
试试这个:
if (argv[1] == std::string("yes")) { stuff }
如果练习的目的是教授字符串比较如何工作,那么像其他答案建议一样实现for循环。但是,在C ++中你不应该使用strcmp
- 有一个字符串类是有原因的。
答案 1 :(得分:2)
制作自己的my_string_comp
功能:
// return 0 on success, -1 on failure
int my_string_comp(char* a, char *b) {
if(a && b) { // check for non null pointers
while(*a != '\0' && *b != '\0' && *a == *b) { a++; b++; }
if(*a == '\0' && *b == '\0') { return 0; }
}
return -1;
}
请注意,此函数提供布尔输出,而strcmp
返回与两个输入字符串的词典顺序相对应的值。
答案 2 :(得分:1)
您始终可以使用手动循环比较字符串,逐个字符地进行比较。你的终止条件是当你遇到一个NULL-char(因为在C字符串中以空值终止)或者你遇到第一个字符串中的字符不等于第二个字符串中的对应字符时。
const char* s1 = "abcdefg";
const char* s2 = "abcdefg";
const char* p1 = s1;
const char* p2 = s2;
int same = 0;
for (; (same = (*p1 == *p2)) && *p1 != '\0'; ++p1, ++p2);
if (same) printf("The strings are equal\n");
else printf("The strings are NOT equal\n");
这将为您提供逐个字符的比较。但请注意,这与strcmp
的{{1}}不同,strcmp
进行词典比较,这也会告诉您一个字符串在字母排序方面是否比其他字符串“更少”。但似乎你只需要一个相等比较,它只会告诉你字符串是否相同。
答案 3 :(得分:1)
编写自己的strcmp函数
答案 4 :(得分:0)
您可以对输入字符串进行散列并根据其数值进行切换 - 对于大小写值,使用符号常量的散列值。您可以创建一个外部脚本来生成带有“string”到“hash”映射的头文件。
答案 5 :(得分:0)
我非常高度推荐Boost.Program options用于C ++命令行参数处理。这样的事情可能有点过头了,但是对于任何稍微复杂一点的东西,Boost.Program选项库代码更少,一旦编写就更容易理解,并且让你做一些奇特的事情,比如从配置文件或环境变量中获取参数,或传递命令行,几乎没有工作。
大致如下(未经测试)的东西对您有用:
namespace po = boost::program_options;
int main() {
po::options_description desc("Allowed options");
desc.add_options()
("help", "produce help message")
("yes", "get down")
("no", "get funky")
;
po:variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
if (vm.count("yes")) {
// get down
} else if (vm.count("no")) {
// get funky
}
}
教程页面提供了许多其他示例,这些示例表明添加其他更复杂的命令行参数几乎没有任何作用。
请注意,默认情况下,C ++中不包含boost,但添加它通常不会太难。 Boost是所有C ++程序员都需要注意的那些库集之一。但是请注意,如果你还在学习C ++ ,这可能会有点过分。