0

在我的编程课中,我们目前有一个项目需要我们将参数带入程序。然后,我需要能够检查其中一个参数以查看传递给程序的值,以便我可以选择程序要遵循的适当行为。在之前的家庭作业中,我使用 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 库。我还能怎么做?

4

6 回答 6

5

试试这个:

if (argv[1] == std::string("yes")) { stuff }

如果练习的目的是教授字符串比较的工作原理,那么像其他答案建议的那样实现一个 for 循环。但是,在 C++ 中你不应该使用strcmp- 有一个字符串类是有原因的。

于 2009-11-24T18:58:29.893 回答
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返回与两个输入字符串的字典顺序相对应的值。

于 2009-11-24T19:08:20.887 回答
1

您始终可以使用手动 for 循环比较字符串,逐个字符进行比较。您的终止条件将是当您遇到 NULL 字符(因为在 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的意义上不同,strcmp它还会告诉您一个字符串在字母顺序方面是否比其他字符串“少”。但似乎你只需要一个相等比较,它只会告诉你字符串是否相同。

于 2009-11-24T18:56:08.293 回答
1

编写自己的 strcmp 函数

于 2009-11-24T18:58:55.697 回答
0

您可以散列输入字符串并根据其数值进行切换 - 对于案例值,使用符号常量的散列值。您可以制作一个外部脚本来生成带有“字符串”到“哈希”映射的头文件。

于 2009-11-24T19:12:03.987 回答
0

我强烈推荐Boost.Program 选项用于 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++,这可能是矫枉过正。

于 2009-11-25T03:45:24.387 回答