C++程序接收命令行参数执行ls命令报错的原因及修复方法
错误成因
- C++ 中
const char*类型的C风格字符串不支持直接用+运算符拼接。代码中"ls" + argv[1]实际执行的是指针算术运算:将字符串字面量"ls"的首地址,加上argv[1]指针存储的地址偏移量,最终得到的是完全非法的内存地址,并非预期的拼接后的命令字符串,传入system函数后自然会执行失败。 - 即使拼接逻辑正确,代码也缺少了
ls命令和参数之间的空格,直接拼接会得到lstest这类无法被系统识别的错误命令。
修复方案
使用C++标准库的std::string完成字符串拼接,同时补充参数合法性校验即可,修改后的代码如下:
#include <iostream> #include <string> #include <cstdlib> using namespace std; int main(int argc, char* argv[]){ // 校验入参是否存在 if (argc < 2) { cout << "请传入要查看的目录名" << endl; return 1; } // 用std::string完成拼接,注意ls后添加空格 string command = string("ls ") + argv[1]; system(command.c_str()); return 0; }
如果需要适配带空格、特殊字符的目录参数,还需要额外对参数做转义处理,避免出现命令注入风险。
内容的提问来源于stack exchange,提问作者user15425699
相关产品推荐
相关产品推荐

