我正在尝试在程序开头编写一个小代码,该代码运行不同的函数,具体取决于从命令行调用程序时传递的文件的文件扩展名。
我想将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周围找到了类似的解决方案,但没有一个解决了将任何参数保存到字符串变量中的问题。每当我尝试使用strccmp
或argv[1]
之类的东西时,调试器会抱怨下标超出范围,我对如何解决此问题感到茫然。
argv[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")) { ... }
错误......通过string
将c_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
. . .
}
. . .
}