如何在C ++中加入两个反斜杠

时间:2011-03-10 02:57:20

标签: c++ path directory

我需要创建一个接受目录路径的函数。但是为了让编译器读取反斜杠,我需要创建一个函数,将一个反斜杠变为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;
} 

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

5 个答案:

答案 0 :(得分:5)

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

你的循环条件也允许超过数组的边界(因为最后一个(99999)元素实际上是索引99998而不是99999 - 数组是从零开始的):

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

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

在任何情况下,都不需要从用户输入中转义反斜杠。反斜杠是一个像任何其他字符一样的单个字符;只有在代码中嵌入字符串文字时才会特别。

答案 1 :(得分:2)

在这一行:

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;
}

答案 2 :(得分:1)

很多错。没有测试这个,但它会让你更接近 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;
} 

答案 3 :(得分: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;
}

答案 4 :(得分:1)

  

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

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

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

编译器永远不会实际调用您的函数只编译它。所以编写这样的函数,这样编译器就可以读取字符串,这不会解决你的问题。