在C ++中将所有和任何命令行输入转换为字符串

时间:2015-07-23 13:01:01

标签: c++ string argv

我正在尝试在程序开头编写一个小代码,该代码运行不同的函数,具体取决于从命令行调用程序时传递的文件的文件扩展名。

我想将CREATE TABLE `location_share` ( `circle_id` int(11) NOT NULL DEFAULT '0', `user_id` int(11) NOT NULL DEFAULT '0', `location_sharing_id` int(11) DEFAULT NULL, PRIMARY KEY (`user_id`,`circle_id`), KEY `fkcircle1` (`circle_id`), KEY `fksharing_policy` (`location_sharing_id`), CONSTRAINT `fkcircle1` FOREIGN KEY (`circle_id`) REFERENCES `circle` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `fksharing_policy` FOREIGN KEY (`location_sharing_id`) REFERENCES `share` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `fkuser1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; 转换为一个字符串(称为argv[2]),我可以使用st将其与".png"".txt"等进行比较。< / p>

我在SO周围找到了类似的解决方案,但没有一个解决了将任何参数保存到字符串变量中的问题。每当我尝试使用strccmpargv[1]之类的东西时,调试器会抱怨下标超出范围,我对如何解决此问题感到茫然。

argv[2]

2 个答案:

答案 0 :(得分:1)

纠正了明显的问题,您的代码编译并运行得很好。

#include <iostream>
#include <vector>
#include <string>

int main( int argc, char ** argv )
{
    std::vector< std::string > all_arg;
    if ( argc > 1 )
    {
        all_arg.assign( argv + 1, argv + argc );
    }

    for ( auto str : all_arg )
    {
        std::cout << str << "\n";
    }
}

至于你的比较,这看起来很诡异......

st = st.substr(check.size() - 4, check.size() - 1);

除了check没有定义,如果你的字符串短于4个字符会发生什么......?

if (strcmp(st.c_str(), ".png")) { ... }

错误......通过stringc_str()降级为char数组,然后通过C函数strcmp()?这是为了什么?

尝试这样的事情:

for ( auto str : all_arg )
{
    std::string extension;
    std::string::size_type length = str.length();

    if ( length >= 4 )
    {
         extension = str.substr( size - 4 );
    }

    if ( extension == ".png" )
    {
        std::cout << str << "is PNG!\n";
    }
}

然后考虑以上是区分大小写的,并且一旦考虑在比较之前将str转换为小写,consider locale, which might include Unicode。 ; - )

答案 1 :(得分:1)

此处不需要

std::vector,第一个命令行参数用作argv[1]而不是argv[2]。简单地

int main(int argc, char ** argv) {
    if (argc == 2) {
        string st(argv[1]);
        string::size_type idx = st.rfind('.');
        if (idx != string::npos)
            st.erase(0, idx);    // Extract the extension
        . . .
    }
    . . .
}