【问题标题】:How to put two backslash in C++如何在 C++ 中添加两个反斜杠
【发布时间】:2011-07-12 09:57:38
【问题描述】:

我需要创建一个接受目录路径的函数。但是为了让编译器读取反斜杠,我需要创建一个函数,将一个反斜杠变成 2 个反斜杠。到目前为止,这是我的代码:

string stripPath(string path)
{       
        char newpath[99999];
        //char *pathlong;
        char temp;
        strcpy_s(newpath, path.c_str());
        //pathlong = newpath;
        int arrlength = sizeof(newpath);

            for (int i = 0; i <= arrlength ;i++)
            {
                if(newpath[i] == '\\')
                {
                    newpath[i] +=  '\\';
                    i++;
                }
            }
            path = newpath;
        return path;
} 

此代码接收来自用户的输入,该输入是带有单个反斜杠的目录路径。 问题是它给出了一个肮脏的文本输出;

【问题讨论】:

    标签: c++ path directory


    【解决方案1】:

    条件if (newpath[i] = '\\') 应该是if (newpath[i] == '\\')

    语句newpath[i] += '\\'; 不会给出预期的连接结果。它会将'\\' 的整数值添加到newpath[i]

    此外,您为什么在函数内使用char newpath[99999]; 数组。 newpath 可以是 std::string newpath

    int main()
    {
      std::string path = "c:\\test\\test2\\test3\\test4";
    
      std::cout << "orignal path: " << path << std::endl;
    
      size_t found = 0, next = 0;
      while( (found = path.find('\\', next)) != std::string::npos )
      {
        path.insert(found, "\\");
        next = found+4;
      }
    
      std::cout << "path with double slash: " << path << std::endl;
    
      return 0;
    }
    

    【讨论】:

      【解决方案2】:

      但是为了让编译器读取 我需要创建一个反斜杠 将成为一个的功能 反斜杠变成2个反斜杠

      编译器只在你编译时读取字符串,在这种情况下你需要两个,因为第一个反斜杠将是一个转义字符。因此,如果您要在代码中使用静态路径字符串,则必须执行以下操作:

      std::string path = "C:\\SomeFolder\\SomeTextFile.txt";
      

      编译器永远不会真正调用你的函数,只编译它。所以写一个这样的函数让编译器可以读取一个字符串并不能解决你的问题。

      【讨论】:

      • @Codeface:这是对 OP 的一种非常怀疑的解释——我喜欢它。我想我假设这里发生了一些代码生成,例如,这个程序需要添加转义,因为路径正在作为字符串文字写入文件。
      【解决方案3】:

      int arrlength = sizeof(newpath); 将整个数组的大小(在chars 中)分配给arrlength。这意味着您在数组中迭代超过 99999 个字符,即使路径更短(它可能是)。

      您的循环条件还允许超出数组的边界(因为最后一个(第 99999 个)元素实际上位于索引 99998,而不是 99999 - 数组从零开始):

      for (int i = 0; newpath[i]] != '\0'; i++)
      

      此外,当您可以直接循环遍历 string 对象时,没有理由先将字符串复制到字符数组中。

      无论如何,无需从用户输入中转义反斜杠。反斜杠和其他任何字符一样是单个字符;它仅在嵌入到代码中的字符串文字中时才特别

      【讨论】:

      • +1 用于发现我最初忽略的错误。我认为,在我们两个之间,我们仍然没有列出所有错误的地方:)
      • @phooji:当我意识到代码在做什么时,我停止了寻找 ;-)
      【解决方案4】:

      很多错误。没有测试这个,但它会让你更接近 http://www.cplusplus.com/reference/string/string/

      string stripPath(string path)
      {       
              string newpath;  
                for (int i = 0; i <= path.length() ;i++)
                  {
                      if(path.at(i) == '\\')
                      {
                         newpath.append(path.at(i));
                         newpath.append(path.at(i));
                      }
                      else
                         newpath.append(path.at(i));
                  }
              return newpath;
      } 
      

      【讨论】:

        【解决方案5】:

        在这一行:

        if(newpath[i] = '\\')
        

        = 替换为==

        在这一行:

        newpath[i] +=  '\\';
        

        这应该在字符串中添加一个\(我认为这就是你想要的),但它实际上对当前字符做了一些时髦的char 数学运算。因此,您不是在插入字符,而是在破坏数据。

        试试这个:

         #include <iostream>
         #include <string>
         #include <sstream>
        
        int main(int argc, char ** argv) {
          std::string a("hello\\ world");
          std::stringstream ss;
        
          for (int i = 0; i < a.length(); ++i) {
             if (a[i] == '\\') {
               ss << "\\\\";
             }
             else {
               ss << a[i];
             }
          }
        
          std::cout << ss.str() << std::endl;
          return 0;
        }
        

        【讨论】:

        • (我可能在这里跳枪,因为这个问题目前似乎在句子中间结束......)
        • 它仍然会产生脏文本。
        • 它将反斜杠变成脏文本
        • @Andro:我已经提供了一个快速示例,说明如何使用字符串流而不是 C 风格的字符串操作函数来做到这一点。
        猜你喜欢
        • 1970-01-01
        • 2013-11-10
        • 1970-01-01
        • 2015-10-23
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        • 2012-04-25
        相关资源
        最近更新 更多