【问题标题】:C++ command line argument comparisonC++ 命令行参数比较
【发布时间】:2011-04-08 14:19:30
【问题描述】:

我正在对 C++ 中命令行传递的参数进行一些验证,但遇到了一些困难。

我就是这样

./a.exe inputfile.txt outputfile.txt 16 flush_left

我正在尝试像这样进行验证

if(argv[4] == "flush_left" || argv[4] == "flush_justify" || argv[4] == "flush_right"){

而且它没有按计划进行。虽然我不明白为什么这不起作用。从我阅读和看到的所有内容来看,应该没问题

【问题讨论】:

  • @moi 号 0: ./a.exe, 1: inputfile.txt, 2: outputfile.txt, 3: 16, 4: flush_left

标签: c++ command-line-arguments


【解决方案1】:

尝试:

std::string argv4 = argv[4];
if(argv4 == "flush_left" || argv4 == "flush_justify" || argv4 == "flush_right"){
  //...
}

或(未经测试):

if( argc >=4 && (!strcmp(argv[4],"flush_left")  || !strcmp(argv[4],"flush_justify") || !strcmp(argv[4],"flush_right")) ) {
  //...
}

argv[4] 的类型为char*,而字符串文字的类型为const char*,您无法使用== 运算符比较这些类型的内容(=文本),您必须使用@987654326 之类的东西@ 或 std::string 类。

char* 上使用== 比较变量的地址,而不是内容。

【讨论】:

  • 另一种可能性是使用 strcmp()。但是,正如您所展示的,我会选择 std::string。
  • "strcmp/strncmp 返回不匹配的字符数量" - 这是一个勇敢的断言。愿意说明你的来源吗?
  • @pax Brave 就是一个词 :)
  • 哦,好吧,smerlin 不会修复错误,我想我们必须自己解决 :-)
  • 我认为 strncmp() 不合适 - 使用 strcmp()。如果您使用strncmp(),则参数flush_leftwards 将被视为等于flush_left。如果您确实使用strncmp(),请使用(例如):strncmp(argv[4], "flush_left", sizeof("flush_left"))(相当于第三个参数的 11),因为它会检查最后一个字符是否为“\0”。
【解决方案2】:

./a.exe inputfile.txt outputfile.txt 16 flush_left

基于零的 argv 为您提供: argv[0] = a.exe argv[1] = 输入文件.txt argv[2] = 输出文件.txt argv[3] = 16 argv[4] = flush_left

所以索引是正确的,但是你应该使用 strcmp(stringa, stringb) 并确保它返回 0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2022-10-23
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 2016-12-22
    相关资源
    最近更新 更多