我需要创建一个接受目录路径的函数。但是为了让编译器读取反斜杠,我需要创建一个函数,将一个反斜杠变为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;
}
此代码接收来自用户的输入,该用户是具有单反斜杠的目录路径。 问题是它提供了一个脏文本输出;
答案 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";
编译器永远不会实际调用您的函数只编译它。所以编写这样的函数,这样编译器就可以读取字符串,这不会解决你的问题。