将字符串中的反斜杠替换为正斜杠(std::Replace适用于windows,但不适用于linux)



我在Windows中开发一个小型应用程序,其中一个步骤是通过命令行(CMD.exe(向它发送一个路径,类似于以下内容:

c:> my_environment_var catch folder/sub_folder/file.txt

程序接收路径并执行一个进程。为此,我被要求控制两种情况:

  1. 将用户输入的字符串转换为小写
  2. 将用户在路由中输入的后斜杠(\(替换为前斜杠(/(

例如,如果用户输入:

c:> my_environment_var catch FOLDERsub_FolderfiLE.txt

我的"控制";函数应该处理字符串并返回如下结果:

folder/sub_folder/file.txt

全部小写,并带有正斜杠

为了实现这一点,我在我的";控制";功能:

std::transform(argument.begin(), argument.end(), argument.begin(), ::tolower);

std::replace(argument.begin(), argument.end(), '\', '/');

在Windows中,这两个功能都能正常工作。然而,在Linux(Ubuntu(中,只有小写字母的转换才能正常工作,替换函数"删除";反斜杠,类似这样

用户输入:

c:> my_environment_var catch FOLDERsub_FolderFiLe.txt

应用程序打印:

foldersub_folderfile.txt

我已经在谷歌上搜索了几个小时,但根据我读到的std::replace应该可以正常工作。

我很感激任何想法。


编辑:*******************************


感谢您的支持,我读到有必要分享更多的代码,好吧,这里是:

第一步:用户在控制台中写入环境变量以及命令(要执行的操作(和应应用此操作的文件。在这种情况下,我使用catch命令,它将文件名复制到另一个文件(索引(。

c:> my_env_var catch FOLDERsub_FolderFiLe.txt

第二步:应用程序通过主函数接收参数,创建字符串向量,并将向量发送到要处理的函数(Starter类使用argc和argv的值初始化(。

#include "Starter.h"
// more includes
namespace fs = std::filesystem;
int main(int argc, char* argv[]) {
std::string current_path = fs::current_path().string();
std::vector<std::string> arg_container;
Starter starter(current_path, argc, argv);
starter.input_formatter(arg_container);
// more code...
}

第三步:input_formatter((函数接收这些数据并执行过程,这基本上很简单:

  • 复制值​​存储在变量argv中,并将它们添加到之前创建的向量中
  • 遍历向量(最近用argv中的数据填充(,执行两个操作:第一个是将文本转换为小写,第二个是用正斜杠替换反斜杠

`

//some includes
using std::string;
using std::vector;
namespace fs = std::filesystem;
Starter::Starter(string current_path, int argument_count, char* argument_values[])
: current_path{current_path},
argument_count{argument_count},
argument_values{argument_values} {}
void Starter::input_formatter(vector<string>& arg_container) {
std::copy(argument_values, argument_values + argument_count, std::back_inserter(arg_container));
for (auto& argument : arg_container) {
std::transform(argument.begin(), argument.end(), argument.begin(), ::tolower);
std::replace(argument.begin(), argument.end(), '\', '/');
}
}

第四步:假设一旦修改了数据,就会遍历并打印矢量。实际上,其他动作是用矢量执行的,但这并不重要,因为这些动作是用结果执行的。

问题:打印矢量时,与用户输入的路径对应的字符串没有任何斜杠。(也就是说,不管文件夹和/或文件的名称如何。(

foldersub_folderfile.txt

这种情况只发生在Linux上(我只尝试过Ubuntu(,在Windows上一切正常。

PD。我确信这是一个愚蠢的错误,但我一直在寻找解决方案,但仍然找不到。谢谢!

根据您的描述,我猜问题不在于您的代码:而是您为程序提供输入的方式。与Windows不同,Linux不使用作为路径分隔符,相反,它通常被赋予";转义符"--很像C++。因此,您的shell可能会在反斜杠到达程序之前解析出它们。

特别是,如果您使用的是bash,则反斜杠将保留以下字符的字面含义(并且反斜杠将被删除(。如果您想在输入中保留反斜杠,请尝试对其进行转义:

my_environment_var catch FOLDER\sub_Folder\fiLE.txt

另一种方法是用单引号括起字符串,这将禁用其中所有字符的特殊行为:

my_environmnent_var catch 'FOLDERsub_FolderfiLE.txt'

(有关POSIX shell中反斜杠行为的详细信息,请参阅此处。(

最新更新