我正在尝试在包含unix文件路径的string
中扩展变量。例如,字符串为:
std::string path = "$HOME/Folder With Two Spaces Next To Each Other".
这是我使用的wordexp
的代码:
#include <wordexp.h>
#include <string>
#include <iostream>
std::string env_subst(const std::string &path)
{
std::string result = "";
wordexp_t p;
if (!::wordexp(path.c_str(), &p, 0))
{
if (p.we_wordc >= 1)
{
result = std::string(p.we_wordv[0]);
for (uint32_t i = 1; i < p.we_wordc; ++i)
{
result += " " + std::string(p.we_wordv[i]);
}
}
::wordfree(&p);
return result;
}
else
{
// Illegal chars found
return path;
}
}
int main()
{
std::string teststring = "$HOME/Folder With Two Spaces Next To Each Other";
std::string result = env_subst(teststring);
std::cout << "Result: " << result << std::endl;
return 0;
}
输出为:
Result: /home/nidhoegger/Folder With Two Spaces Next To Each Other
您看到的是,尽管输入中的单词之间有两个空格,但现在只有一个空格。
有一种简单的方法可以解决此问题吗?
答案 0 :(得分:3)
您的代码删除路径中双精度空格的原因是因为for循环在每个单词之后仅添加一个空格,而与实际的空格数无关。解决此问题的一种可能的方法是,事先在路径字符串中找到所有空格,然后将其添加。例如,您可以使用以下代码:
Intent
使用std :: string :: find遍历路径并将空格存储在字符串数组中。然后,您可以将for循环中的行修改为
std::string spaces[p.we_wordc];
uint32_t pos = path.find(" ", 0);
uint32_t j=0;
while(pos!=std::string::npos){
while(path.at(pos)==' '){
spaces[j]+=" ";
pos++;
}
pos=path.find(" ", pos+1);
j++;
}
添加适当数量的空格。
答案 1 :(得分:0)
如果要在不寻常命名的文件中保留空格,请用大括号std::string teststring = "\"~/filename with spaces\"";
括起来。但是,注意原始字符串中有多少空格是没有意义的,因为您必须跳过成对的"
并基本上重做wordexp()
的操作。在命令中保留多个空格没有多大意义:ls -al
与ls -al
完全相同,因此修剪是合理的。 OP的代码完全有效-无需添加其他任何内容。
P.S。决定将其添加为笔记,因为我与OP处于同一困境。