【问题标题】:C++ using arguments ARGV [closed]使用参数 ARGV 的 C++ [关闭]
【发布时间】:2014-05-14 01:49:09
【问题描述】:

我想将 argv[(本例中为 2)] 存储到向量中,稍后在程序中使用。问题是没有操作数匹配那些操作数 std::string == int。那么这是否意味着应用程序将'-r'视为int?我在这里有点困惑。

int main(int argc, char* argv[])
{
    std::vector<std::string> argList;
    cout<<"argc: "<<argc<<endl;
    for(int i=2; i<=argc; i++)
    {
        argList.push_back(argv[i]);
    }
    if(argList.at(2) == '-r') cout<<" Good job ";
}

【问题讨论】:

  • 你只需要双引号来生成字符串文字:"-r"。使用单引号,它是 int 类型的文字。
  • argv[2] 被放置在 argList[0] 并且 argList[2] 包含 argv[4] 那么您是否将 4 个参数传递给您的程序?确实,您应该在尝试访问元素 2 之前检查向量的大小
  • @AndrewMedico 实际上是 char 类型,可以自动装箱成 int。
  • 哎呀,你是对的 - C 和 C++ 之间的区别之一。我不会说“自动装箱”(也许是“隐式转换”)——C++ 不做装箱,int 也不是对象。

标签: c++ string


【解决方案1】:

你的程序有几个问题:

  1. 您迭代i 直到i == argc,这将尝试从argv[argc] 构造一个字符串,这是一个NULL 指针,因为C 和C++ 标准要求argv[argc] 为0 (NULL),请参阅@987654321 @。 argv 是一个数组,其中argc 指向null-terminated character strings 的指针(以ASCII NUL,0 终止),数组本身以NULL 指针终止(不计入argc)。现在,在 C++ 中,您可以从指向以空字符结尾的字符串的指针构造字符串,但是将 NULL 指针传递给字符串构造函数会导致未定义的行为 see this SO question,另请参阅 std::string 构造函数列表 @987654324 @,您在该列表中隐式使用构造函数 (4)(来自 c-string)。
  2. 您开始使用i==2 向argList 推送,这意味着argList[0] 将包含argv[2],然后您引用argList.at(2),它将对应于argv[4],这可能不是您的意思。李>
  3. 字符串文字使用双引号

我已经更正了这些并创建了一个工作程序,点击here

#include <iostream>
#include <vector>
#include <string>
using std::vector;
using std::string;
using std::cout;
using std::endl;

int main(int argc, char* argv[])
{
    vector<string> argList;
    cout << "argc: " << argc << endl;
    for(int i=0; i < argc; ++i)
    {
        argList.push_back(argv[i]);
    }
    cout << "Program name is " << argList[0] << endl;
    if(argc > 1) {
        if(argList.at(1) == "-r") {
            cout << " Good job, you supplied -r\n";
        } else {
            cout << "Unrecognized option " << argList[1]
                << "\nUsage: " << argList[0] << " -r\n";
        }
    }
    return 0;
}

【讨论】:

【解决方案2】:

问题是您在'-r' 中使用了单引号。你想在这里用双引号:

if(argList.at(2) == "-r") cout<<" Good job ";

原因是在 C++ 中,单引号仅用于字符。有一个“多字节字符常量”之类的东西,这就是'-r' 的最终结果。这与你想要的字符串常量完全不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2020-05-19
    • 2015-08-12
    • 1970-01-01
    相关资源
    最近更新 更多