C++ 脏字符*

Posted

技术标签:

【中文标题】C++ 脏字符*【英文标题】:C++ dirty char* 【发布时间】:2014-05-20 20:13:06 【问题描述】:

我有这个功能可以读取目录中的照片:

vector<Mat> vImg;
Mat rImg;

DIR *dir;
struct dirent *file;
int count = 0;
std::vector<char*> arr; 

if(argc >= 2)
char* imgFolder = argv[1];
if ((dir = opendir(imgFolder)) != NULL) 
  while ((file = readdir(dir)) != NULL)         
    std::string fn = file->d_name;
    std::string ext = StringToUpper(fn.substr(fn.find_last_of(".") + 1));
    if(ext == "JPG" || ext == "PNG" || ext == "JPEG") 
      count += 1;  
      char* itm = new char[100];
      strcat(itm, imgFolder);
      strcat(itm, "/");
      strcat(itm, file->d_name);
      printf("%s\n",itm);
      vImg.push_back(imread(itm));
    
  
  closedir (dir);

问题是在第一个之后

vImg.push_back(imread(itm));

所有其他“itm”都像这样弄脏:

有人可以帮帮我吗? 谢谢! :)

【问题讨论】:

您将 c_strings 与 std::vectors 和 std::strings 混合的任何特殊原因? 我不知道这是否是您的实际代码,但您有内存泄漏,因为您不断分配 100 chars 的缓冲区并且从不删除它。 我不认为这是泄漏,他可能将它们存储在向量中以供以后使用(并希望也可以释放它们)。 另外 100 个字符不一定足够。如果路径和/或文件名特别长,您可能会遇到缓冲区溢出。 在这些情况下通常使用PATH_MAXMAX_PATH(取决于平台)。 【参考方案1】:

你的错误在这里:

  char* itm = new char[100];
  strcat(itm, imgFolder);  // <-- oops

第一个strcat 应该是strcpy。否则,您将追加到未初始化的内存中。

此外,您永远不会在任何地方删除 char 数组。

【讨论】:

delete[]。不是delete

以上是关于C++ 脏字符*的主要内容,如果未能解决你的问题,请参考以下文章

脏字过滤

javascript屏蔽脏字

php 过滤垃圾代码过滤脏字

适用于字节数组的 C++ 类(如字符上的字符串)

字符串末尾的额外零字符出现在 C++ 中用于范围循环

留言板过滤 脏字 问题 求 一个能用的 正则表达式匹配并替换. 如过滤 TextBox1 里面的文本