gpt4 book ai didi

c++ - 使用 boost::regex 从目录中获取带有某些正则表达式的文件名时出现意外输出

转载 作者:行者123 更新时间:2023-11-30 04:58:03 25 4
gpt4 key购买 nike

我刚刚创建了一个函数 findFile 来查找目录 dir_name 中是否有具有某种模式 file_name_regex 的文件。只需在 Coliru 中测试即可

#include <string>
#include <iostream>
#include <boost/regex.hpp>
#include <boost/filesystem.hpp>

namespace fs = boost::filesystem;

bool findFile(const std::string & dir_name, const std::string & file_name_regex)
{
fs::path p(dir_name);
if (!exists(p))
return false;

boost::regex file_regex(file_name_regex, boost::regex::basic);

fs::directory_iterator end_itr;
for (fs::directory_iterator itr(p);itr != end_itr; ++itr )
{
if (!fs::is_directory(itr->path()))
{
boost::sregex_iterator it(itr->path().filename().string().begin(),
itr->path().filename().string().end(),
file_regex);
boost::sregex_iterator end;
for (; it != end; ++it){
std::cout << it->str() << std::endl;
}
}
else {
continue;
}
}
return false;
}

int main()
{
findFile("/", "a.out" );
}

编译运行命令:

g++ -std=c++11 -O2 -Wall -lboost_system -lboost_filesystem -lboost_regex main.cpp && ./a.out

它应该打印出来:

a.out

但它给出了意想不到的输出:

.out

它基于C++ Regular Expressions with Boost Regex的解决方案

我也在 Coliru 中对其进行了更改以进行简单测试:

#include <boost/regex.hpp>
#include <iostream>
#include <string>

int main()
{
std::string text("a.out");
const char * pattern = "a.out";
boost::regex ip_regex(pattern);

boost::sregex_iterator it(text.begin(), text.end(), ip_regex);
boost::sregex_iterator end;
for (; it != end; ++it) {
std::cout << it->str() << "\n";
// v.push_back(it->str()); or something similar
}
}

它打印出预期的单词a.out

那么我的代码有什么问题?

最佳答案

由于悬挂指针,您获得了 UB。临时 itr->path().filename().string() 在以下语句结束时被销毁:

        boost::sregex_iterator it(itr->path().filename().string().begin(),
itr->path().filename().string().end(),
file_regex);

所以 begin()end() 现在指向垃圾。

您需要将临时 string 提升到一个单独的变量中以延长其生命周期:

        std::string s = itr->path().filename().string();
boost::sregex_iterator it(s.begin(), s.end(), file_regex);

关于c++ - 使用 boost::regex 从目录中获取带有某些正则表达式的文件名时出现意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51840638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com