- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试在包含 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
你看,虽然输入中的单词之间有两个空格,但现在只有一个空格。
有解决这个问题的简单方法吗?
最佳答案
您的代码删除路径中双空格的原因是因为您的 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++;
}
使用 std::string::find 遍历您的路径并将空格存储在字符串数组中。然后,您可以将 for 循环中的行修改为
result += spaces[i-1] + std::string(p.we_wordv[i]);
加入适当数量的空格。
关于c++ - wordexp 和带空格的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51174163/
有谁知道wordexp()字符串行为,其中包含 '|'或 '&' . 我用 wordexp(str, &res, WRDE_UNDEF) ,但包含所有字符串,其中包含 '|'或 '&' wordexp
我正在尝试在包含 unix 文件路径的 string 中扩展变量。例如字符串是: std::string path = "$HOME/Folder With Two Spaces Next
有没有办法在 java 中进行 shell 通配符扩展,类似于 C 函数调用 wordexp 的工作方式?它似乎有点特定于平台,但是在其中一个 Java 系统类中必须有一个很好的抽象,对吧?如果我能让
我们需要在 wordexp 失败时调用 wordfree 吗?在某些情况下调用 wordfree 似乎会出现段错误(例如,当 wordfree 返回错误代码且字符串为“foo 'bar”时)。这在手册
我对 Linux C 编程相当陌生,需要一些帮助来使用 stat 和 wordexp 函数显示可执行文件和隐藏文件。任何帮助表示赞赏。这是我到目前为止所拥有的: int main(int argc,
环境 操作系统:Ubuntu 20.4、Centos 8、macOS Catalina 10.15.7 语言:C、C++ 编译器:gcc(每个操作系统的最新版本) 问题 我正在使用 wordexp P
我正在尝试创建一个小型 Linux 命令行应用程序。可以通过在调用应用程序时传递参数来运行应用程序,我使用 getopt() 对其进行解析。 可以选择以交互模式运行此应用程序,在这种情况下会显示一个小
我是一名优秀的程序员,十分优秀!