C++使用argv时出现Segmentation Fault问题及相关疑问
命令行参数处理的段错误问题及解决
初始代码与报错
我最初写了这段代码:
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; }
执行std::string dateString = args[1];时触发了Segmentation Fault错误。
需求说明
我的目标是通过./myalgorithm 2022-09-01这样的命令传入日期参数,把argv[1]里的日期转成std::string,再拆分出年、月、日做计算,原本打算用string.substr()实现:
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; }
疑问
我搞不懂为什么一定要用循环把所有参数存入vector,而不能直接这么写:
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("%d\n", gpsweek); } return 0; }
内容的提问来源于stack exchange,提问作者IceCode
相关产品推荐
相关产品推荐

