- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想做的是获取一条路径,然后逐个目录不断地删除路径,随时检查它是否是符号链接(symbolic link)。这是我所拥有的:
static bool isLinkDirInSymLink (std::string linkPath)
{
DIR *baseDir;
struct dirent *currentDir;
do
{
baseDir = opendir(linkPath.c_str());
if (baseDir)
{
currentDir = readdir(baseDir);
if (currentDir->d_type == DT_LNK)
return true;
}
linkPath.erase (linkPath.find_last_of("/") + 1, linkPath.find_first_of("\0"));
} while (strcmp(linkPath.c_str(), "") != 0);
return false;
}
这陷入了无限循环。当我在 gdb
中运行程序时会发生什么是我发送一个 linkPath
的 /home/user/test/linktest/out/mDirs/testDir1/test
, 当这成功删除并且我剩下的是 /home/user/test/linktest/out/mDirs/testDir1
,然而这是无限循环开始的地方。即使这与进入 erase
时的第一条路径格式相同, 什么都没发生。我尝试了很多不同的 erase
变体。来自 here但似乎都不起作用。我也试过linkPath.append('\0')
因为我认为最后可能是空字符的问题。
谢谢大家,这就是我最终得到的:
char realPath[MAX_FILELENGTH];
do
{
if (realpath (linkPath.c_str(), realPath) != NULL)
if (strcmp(linkPath.c_str(), realPath) != 0)
return true;
size_t eraseFrom = linkPath.rfind('/');
if (std::string::npos != eraseFrom)
linkPath.erase(eraseFrom);
} while ( !linkPath.empty() );
return false;
最佳答案
由于 + 1
在你的 erase 调用中,你正在删除从 /
到字符串末尾之前的字符,删除以下字符:
/home/user/test/linktest/out/mDirs/testDir1/test\0
^^^^
循环的第一次迭代将删除 test
,留下 /home/user/test/linktest/out/mDirs/testDir1/
。所有对 erase
的后续调用都不会执行任何操作,因为 /
和 \0
之间的字符为零。
您应该在删除调用中从 linkPath.find_last_of("/") + 1
中删除 + 1
,这样结尾的斜线也会被删除。
此外,erase(size_t, size_t)
重载实际上将要删除的部分的长度 作为第二个参数 - find_first_of
返回找到的字符的索引,而不是它的迭代器。您的代码仅在偶然情况下起作用。使用 std::string::npos
,它将删除所有内容直到结束,而不是 \0
字符的位置(如果你还没有调用 c_str()
。
关于c++ - 不断删除字符串会导致无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31590945/
如果这不是一个错误,那就是另一个错误。如果不是那样的话,那就是别的东西了。我觉得我的项目已经改变了很多,现在只是试图解决代码签名问题,结果一切都搞砸了。我严格按照说明进行操作,但出现错误,例如当前的“
我不确定是否有一些我不知道的内置变量或规则,或者 make 是否有问题,或者我只是疯了。 对于我的一个项目,我有一个如下的 makefile: CC=g++ CFLAGS=-O3 `libpng-co
我有大约 10 个 div,它们必须不断翻转,每个 div 延迟 3 秒 这个 codrops 链接的最后一个效果是我正在寻找的,但无需单击 div http://tympanus.net/Devel
我如何使用 jQuery 持续运行 PHP 脚本并每秒获取响应,以及将鼠标上的少量数据发送到同一脚本? 我真的必须添加一些随机扩展才能让这么简单的计时器工作吗? 最佳答案 To iterate is
JBoss 4.x EJB 3.0 我见过如下代码(大大简化): @Stateless @TransactionAttribute(TransactionAttributeType.NOT_SUPPO
使用 PHPStorm,我试图忽略每次尝试进行 git 提交时 pop 的 workspace.xml。 我的 .gitignore 看起来像: /.idea/ .idea/workspace.xml
我是一名优秀的程序员,十分优秀!