【问题标题】:Parsing command line in MSVC在 MSVC 中解析命令行
【发布时间】:2015-03-12 02:07:28
【问题描述】:

并不是真正询问解析命令行参数,而是读取它们的代码 (C++)

我在 MSVC2010 中写过。选择Project\DEbugging\Command Line Arguement),我写了如下

"testvid" 10000 15000

全部用空格隔开

对于我读入的代码,我使用字符串流来读入

string folder;
int begin;
int end;

if(argc = 4){
    std::stringstream ssArgConverter;

    folder = argv[1];

    ssArgConverter << argv[2];
    if(ssArgConverter >> begin)
    {
       // success
       ssArgConverter.str("");
    }

    ssArgConverter << argv[3];
    if(ssArgConverter >> end)
    {
       // success
       ssArgConverter.str("");
    }

}

已经测试了程序,但我似乎在最后一个参数中阅读有问题。我的程序中参数的打印值为

folder : testvid
begin  : 10000
end    : -89456273

只是想不通是哪里出了问题。在这里需要一些帮助。谢谢

【问题讨论】:

  • 注意:如果ssArgConverter读取argv[2]失败,你仍然需要让它脱离错误状态(可能通过clearing错误状态)。
  • 顺便说一句,当您使用调试器单独单步执行每个语句时出现了什么问题?
  • 为什么在if 语句中将值 4 分配给 argc
  • 我有 3 个参数和一个函数名...所以我认为 argc 值为 4
  • @user1538798:好的,但是if(argc = 4){ 将4 分配给argc,而if(argc == 4){ 比较它们。

标签: c++ visual-c++ command-line-arguments stringstream


【解决方案1】:

您需要清除您的字符串流,而不是将其内容设置为“”。

string folder;
int begin;
int end;

if(argc == 4){
    std::stringstream ssArgConverter;

    folder = argv[1];

    ssArgConverter << argv[2];
    if(ssArgConverter >> begin)
    {
       // success
       ssArgConverter.str("");
       ssArgConverter.clear();
    }

    ssArgConverter << argv[3];
    if(ssArgConverter >> end)
    {
       // success
       ssArgConverter.str("");
       ssArgConverter.clear();
    }
}

编辑:这个问题非常类似于:How to clear stringstream? 并且接受的答案有一个很好的解释。

所以你实际上应该使用 .str("") 或 .str(std::string()) 和 .clear()

【讨论】:

  • 感谢您的帮助!不知道这需要额外的 .clear()。每当我解析文件中的数据时,我就一直在使用 .str("") 方法,它一直对我有用
猜你喜欢
  • 2010-11-27
  • 1970-01-01
  • 2013-11-18
  • 2012-05-09
  • 2013-01-13
  • 1970-01-01
  • 2020-01-25
  • 2013-03-07
  • 2013-11-14
相关资源
最近更新 更多