在 C++ 中将所有和任何命令行输入转换为字符串
Convert all and any command line input to string in C++
我正在尝试在我的程序开头编写一段小代码,该代码根据从命令行调用程序时传递的文件的文件扩展名运行不同的功能。
我想将 argv[2]
转换成一个字符串(称为 st
),我可以使用 strccmp
与 ".png"
、".txt"
等进行比较.
我在 SO 周围找到了类似的解决方案,但其中 none 解决了将任何参数保存到字符串变量中的问题。每当我尝试使用 argv[1]
或 argv[2]
之类的东西时,调试器都会抱怨下标超出范围,我不知道如何解决这个问题。
int main(int argc, char** argv)
{
// First and simplest attempt
sd::string st = argv[2];
// Second attempt that also fails
std::vector<std::string> all_arg;
if (argc > 1) {
all_arg.assign(argv + 1, argv + argc);
}
std::string st = all_arg[2];
// Comparison
st = st.substr(st.size() - 4, st.size() - 1);
if (strcmp(st.c_str(), ".png")) { ... }
else {...}
}
更正了明显的问题,您的代码可以正常编译和运行。
#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")) { ... }
错误...通过 c_str()
将 string
降级为字符数组,然后通过 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。 ;-)
此处不需要 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
. . .
}
. . .
}
我正在尝试在我的程序开头编写一段小代码,该代码根据从命令行调用程序时传递的文件的文件扩展名运行不同的功能。
我想将 argv[2]
转换成一个字符串(称为 st
),我可以使用 strccmp
与 ".png"
、".txt"
等进行比较.
我在 SO 周围找到了类似的解决方案,但其中 none 解决了将任何参数保存到字符串变量中的问题。每当我尝试使用 argv[1]
或 argv[2]
之类的东西时,调试器都会抱怨下标超出范围,我不知道如何解决这个问题。
int main(int argc, char** argv)
{
// First and simplest attempt
sd::string st = argv[2];
// Second attempt that also fails
std::vector<std::string> all_arg;
if (argc > 1) {
all_arg.assign(argv + 1, argv + argc);
}
std::string st = all_arg[2];
// Comparison
st = st.substr(st.size() - 4, st.size() - 1);
if (strcmp(st.c_str(), ".png")) { ... }
else {...}
}
更正了明显的问题,您的代码可以正常编译和运行。
#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")) { ... }
错误...通过 c_str()
将 string
降级为字符数组,然后通过 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。 ;-)
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
. . .
}
. . .
}