直到现在我有:
int main(int argc, char * argv[]) {
std::vector<std::string> args;
for (int i = 1; i < argc; i++) {
args.push_back({ argv[i] });
}
std::string dateString = args[1];
return 0;
}
我在网上Segmentation Fault
:std::string dateString = args[1];
我想做的是使用类似的东西:./myalgorithm.cpp 2022-09-01
2022-09-01
是日期。然后,我想通过argv[1]
到达这个日期,将其保存到std::string variable
,然后对日期( 2022、09 和 01)中的每个值进行一些计算。
我想将此日期保存到string
,然后使用string.substr(...)
将日期中的数字保存到int variables
:
int year = stoi(mystring.substr(0,4));
int month = stoi(mystring.substr(6,2));
int day = stoi(mystring.substr(9,2));
编辑: 我编辑了我的代码,它可以工作:
int main(int argc, char * argv[]) {
std::vector<std::string> args;
for (int i = 1; i < argc; i++) {
args.push_back({ argv[i] });
}
for (auto dateString: args) {
double year = stoi(dateString.substr(0,4));
double month = stoi(dateString.substr(5,2));
double day = stoi(dateString.substr(8,2));
std::cout << year << std::endl;
std::cout << month << std::endl;
std::cout << day << std::endl;
}
return 0;
}
但我不明白为什么我需要写:
std::vector<std::string> args;
for (int i = 1; i < argc; i++) {
args.push_back({ argv[i] });
}
而不是简单地:
std::vector<std::string> args;
args.push_back({ argv[1] });
编辑:
更正的代码:
int main(int argc, char * argv[]) {
std::vector<std::string> args;
if (argc > 1){
args.push_back({ argv[1] });
}
for (auto dateString: args) {
int year = stoi(dateString.substr(0,4));
int month = stoi(dateString.substr(5,2));
int day = stoi(dateString.substr(8,2));
int gpsweek = GPSweek(year, month, day);
printf("%dn", gpsweek);
}
return 0;
}
当你使用./myalgorithm.cpp 2022-09-01
时,什么是argc
和argv
?
argc
是参数计数 + 程序名称。
argv
是程序名称和这些参数。
所以argc
= 2 和argv
= { myalgorithm.cpp, 2022-09-01 }
std::vector<std::string> args;
for (int i = 1; i < argc; i++) {
args.push_back({ argv[i] });
}
在代码之后,变量args
是 { "2022-09-01" },因为您从 i = 1 而不是 0 开始。
C++数组(包括 std::vector)索引从 0 开始,因此第一项的索引为 0。如果您尝试获取索引 = 1 的第二项,则它是数组越界。这是C++中未定义的行为,分割错误是结果之一。
使用args[0]
取第一项 - "2022-09-01"。
基于范围的for
使用迭代器,对于 std::vector,从索引 = 0 开始,因此您的正确代码有效。