把\0替换成其他字符,比如空格
//此处读取命令行
std::fstream fs("/proc/self/cmdline");
std::stringstream ss;
ss << fs.rdbuf();
std::string cmd = ss.str();
LOG(INFO) << "cmd:" << cmd << std::endl;
int pos_0 = cmd.find('\0');
while (pos_0 != -1) {
cmd.replace(pos_0, 1, " ");
pos_0 = cmd.find('\0');
}
LOG(INFO) << "cmd:" << cmd << std::endl;
// Parse gflags.
std::fstream fs("/proc/self/cmdline");
std::stringstream ss;
ss << fs.rdbuf();
std::string cmd = ss.str();
// char* argv_temp[10000];
// int argc = 1;
// argv_temp[0] = &cmd[0];
// for (int i = 0; i < cmd.length() - 1; i++) {
// if (cmd[i] == '\0' && argc < 10) {
// if (strncmp(&cmd[i + 1], "--flagfile", 10)) {
// continue;
// }
// argv_temp[argc] = &cmd[i + 1];
// std::cout << "i= " << i << " argc=" << argc <<
// argv_temp[argc]; argc++;
// }
// }
LOG(INFO) << "saved cmd:" << cmd << std::endl;
int pos_0 = cmd.find('\0');
while (pos_0 != -1) {
cmd.replace(pos_0, 1, " ");
pos_0 = cmd.find('\0');
}
LOG(INFO) << "original cmd:" << cmd << std::endl;
// use C++11
// std::regex re_zero(" ");
// std::vector<std::string> cmd_vector(
// std::sregex_token_iterator(cmd.begin(), cmd.end(), re_zero,
// -1), std::sregex_token_iterator());
// use string
// std::string delimiters = "\0";
// std::vector<std::string> cmd_vector;
// auto lastPos = cmd.find_first_not_of(delimiters, 0);
// auto pos = cmd.find_first_of(delimiters, lastPos);
// while (std::string::npos != pos || std::string::npos != lastPos) {
// cmd_vector.emplace_back(cmd.substr(lastPos, pos - lastPos));
// lastPos = cmd.find_first_not_of(delimiters, pos);
// pos = cmd.find_first_of(delimiters, lastPos);
// }
// use strtok
std::vector<std::string> cmd_vector;
char cmd_char[cmd.length() + 1];
int cmd_i = 0;
for (cmd_i = 0; cmd_i < cmd.length(); cmd_i++) {
cmd_char[cmd_i] = cmd[cmd_i];
}
cmd_char[cmd_i] = '\0';
char* delim = (char*)" ";
char* p = nullptr;
std::string cmd_item = std::strtok(cmd_char, delim);
cmd_vector.push_back(cmd_item);
while ((p = std::strtok(nullptr, delim))) {
std::string cmd_item_p = p;
cmd_vector.push_back(cmd_item_p);
}
int argc = cmd_vector.size();
char** argv = (char**)malloc(sizeof(char*) * argc);
// char argv[100][200];
for (auto i = 0; i < argc; i++) {
int len = cmd_vector[i].length();
argv[i] = (char*)malloc(sizeof(char) * (len + 1));
cmd_vector[i].copy(argv[i], len, 0);
argv[i][len] = '\0';
LOG(INFO) << "cmd item:" << argv[i] << std::endl;
}
网友评论