【问题标题】:Check if Argument is Empty or Not Same检查参数是否为空或不相同
【发布时间】:2012-12-22 10:57:02
【问题描述】:
#include <iostream>

using namespace std;

int main(int argc,char* argv[]){
    if(argv[1] == ""){
        cout << "please put something" << endl;
    }else if(argv[1] == "string"){
        cout << "yeah string" << endl;
    }else if(argv[1] == "integer"){
        cout << "yeah integer" << endl;
    }
}

我不知道出了什么问题:我尝试检查为 argv[1] 提供的参数是否为空,因此它将为 false 并且应用程序将退出,所以请告诉我我的代码有什么问题。

【问题讨论】:

  • 你知道strcmpstrlen吗?
  • 我是 c++ 的新手,所以我对 c++ 中的函数了解不多,大部分时间我在编码中使用 php,但现在我打算学习 c++..
  • 哦,我的印象是你是一个转向 c++ 的 c 程序员,但不是。所以划掉我的第一条评论。不要学习strcpystrlen 而是学习std::string。 :)
  • 其他人的回答让我明白我错了,顺便说一句,也谢谢你.. :)

标签: c++ if-statement arguments


【解决方案1】:

每个人都在给你不同的答案。事实上,每个人都是对的。

main的签名int main(int argc, char *argv[])继承自C。 在 C 中,字符串是指向 char 的指针。当你对它们使用 operator== 时,你只比较指针值。

比较字符串内容的C方式是使用strcmp

if (strcmp(argv[1], "integer") == 0){

使用 C++ 方式对您来说更安全、更容易。

if (std::string(argv[1]) == "integer"){

这一行从argv[1] 创建一个临时的std::string。您必须包含 string 才能使其正常工作。

最后检查是否argc == 2 以了解是否提供了参数。 确实,argv 是由 standard 3.6.1 终止的空值,但它肯定是 让事情更清楚地检查 argv 确实等于 2。

【讨论】:

  • 所以我们需要在进行比较之前将 char 转换为字符串,感谢提供很好的示例和答案.. :)
【解决方案2】:

不能将== 用于argv[],因为它是char* 类型,请改用strcmp。

int main(int argc, char*argv[])
{
    if(argc == 1){
        cout << "please put something" << endl;
    }else if(strcmp(argv[1], "string") == 0){
        cout << "yeah string" << endl;
    }else if (strcmp(argv[1], "integer") == 0){
        cout << "yeah integer" << endl;
    }
  return 0;
}

或者您需要将 argv[1] 复制到 std::string 然后您可以使用== 运算符。

【讨论】:

    【解决方案3】:

    如果你想用 C++ 编写代码,你可以使用std::string,包括它的标题:

    #include <string>
    

    将第一个参数转换为std::string 并使用它的operator==

    std::string first = argv[1];
    
    if(first == ""){
        cout << "please put something" << endl;
    }else if(first == "string"){
        cout << "yeah string" << endl;
    }else if(first == "integer"){
        cout << "yeah integer" << endl;
    }
    

    char * 与字符串文字进行比较没有意义,如果您将std::stringargv[1] 相比较,那么情况就不同了,它会按您的预期工作。

    但是,您应该首先检查用户提供给程序的参数数量,它位于argc

    【讨论】:

    • 我认为 argv[1] 是字符串(因为结果是字符串),但现在我知道了,谢谢.. :)
    【解决方案4】:

    首先检查 argc 是否 > 1。否则,您访问的内存无效。

    if(argc < 2){
        cout << "please put something" << endl;
    }else if(argv[1] == "string"){
        cout << "yeah string" << endl;
    }else if(argv[1] == "integer"){
        cout << "yeah integer" << endl;
    }
    

    【讨论】:

    • "否则,您访问的内存无效。" - 不,因为 argv 以 NULL 结尾 - 即使没有参数,argv[1] 也是有效的,它只是 NULL
    • 所以如果我让 string(argv[1]) == NULL 是否有意义?
    • (string(argv[1]) == NULL) 的工作方式与 (argc
    【解决方案5】:
             #include <string>
             #include <iostream>
    

    这将使用 c++ 的方式来比较字符串。更安全的方式。 将第一个参数转换为 std::string,然后使用 string::compare 函数

              std::string inString = argv[1];
    
              if(inString.compare("") != 0) 
              {
                 std::cout << "please put something in" << std::endl;
              }
              else if(inString.compare("string") == 0 ){
                 std::cout << "yeah you got a string" << std::endl;
              }
              else if(inString.compare("integer") == 0)
              {
                 std::cout << "yeah you got an integer" << std::endl;
              }
    

    注意:使用 string::compare(字符串或指向字符串的指针)请参阅此函数的参考。字符串与您要比较的内容之间的关系:

    0 他们比较相等。如果比较结果 0,则要么比较的字符串中第一个不匹配的字符的值更大,要么所有比较的字符都匹配但比较的字符串更长。

    【讨论】:

      猜你喜欢
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 2016-03-10
      • 2015-05-04
      • 2014-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多