使用 argv C++时出现分段错误



直到现在我有:

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 Faultstd::string dateString = args[1];

我想做的是使用类似的东西:./myalgorithm.cpp 2022-09-012022-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时,什么是argcargv

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 开始,因此您的正确代码有效。

最新更新