1.问题描述
1. 转义字符’‘转化为’\‘或者’/’?
2. 如何将反斜杠转化为正斜杠或者双斜杠?
3. 怎么让编译器不解释转义字符?
4. 如何检测字符是否发生转义?
5. C语言中怎么检测字符是否转义成功?
6. C语言中怎么判断一个字符是转义字符?
7. C语言中有没有原始字符串的用法?
8. Convert to Raw String Literal?
9. Print raw string from variable? C++?
10. Print raw string from variable? (not getting the answers)
11. Replace backward slashes with forwards slashes or double backward slashes in C++
12. C语言中怎么把"C:\name\a.txt"转化为"C:\name\a.txt"或者"C:/name/a.txt"
13. C print raw bytes?
14. Print raw string from variable?
15. append the raw string modifier to a variable containing a string?
16. Add ‘u’ prefix to string?
上面这些问题,就是我查找的时候用到的可能的,能用的描述方式,但是最终只有一个结果:没有答案。
2.问题分析
- 想着不让编译器解释转义字符,就如同让编译器失职,不可能的,思想上有问题,如果这样想,还不如自己出一个编译器。
- 想着用一种非常偏僻的方式去给字符串变量添加R前缀,后者转化为原始字符串,这种想法就好像是某人脑子里面知道“1+1=2”,却偏要相同“1>1=2”要怎么解释,怎么写,怎么运行才是对的。【你现在所做的事情,方向是错的,你想实现一个C/C++不支持的操作;结果是差的,因为根本不存在这种语法;过程是悲惨的,没想到吧,其他语言中有的支持这样操作,而且没人告诉你C++它不可以这样操作。】
- 再看这个问题,为什么会手动定义一个字符串,用它存储路径的时候使用反斜杠?这不明显是错误的吗?刚学的时候知道修改成双反斜杠?为什么现在要死在这个点上?
- 再者,从输入中读取的反斜杠,在存储的时候会自动转化为双反斜杠,没有必要刻意的处理,这些都是编译器以及编程语言规定好的,运行了几十年没有问题,到了自己这却想着怎么才能颠覆前人?这是错的!
3.相关实现
3.1 使用原始字符串
#include <iostream>
#include <string>
#include <algorithm> //replace()
#include <cstring>
#include <atlstr.h>//CString
#include <cmath>
using namespace std;
int main() {
//1.
string path = R"(C:\hook\magic.txt)";//似乎只能使用原始字符串
replace(path.begin(), path.end(), '\\', '/');//这里的replace是algorithm里面的
cout << path << endl;
//2.
CString str = R"(C:\hook\magic.txt)";
str.Replace('\\','/');
wcout << str.GetString() << endl;
//3.找到了转化的方法,似乎是的???怎么可能
string str_root = "C:\hook\magic.txt";
cout << s + str_root << endl;
//string str ="C:\hook\magic.txt";
//string raw_string = R"()".format(str);
//还是放弃吧!Give up!!!
}
3.2 从控制台读入
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string str;
cout << "读入字符串:";
cin >> str;
cout << "输出字符串:";
cout << str << endl;
replace(str.begin(), str.end(), '\\', '/');
cout << "转化后结果:";
cout << str << endl;
return 0;
}
输出:
读入字符串:C:\book\a.txt
输出字符串:C:\book\a.txt
转化后结果:C:/book/a.txt
3.3 转化为双反斜杠
3.3.1 通过查找&插入实现
#include <iostream>
#include <string>
using namespace std;
int main()
{
string::size_type pos = 0;
string str = "C:\\book\\1.txt";
cout <<"原始字符串:"<< str << endl;
while ((pos = str.find_first_of('\\', pos)) != string::npos)
{
str.insert(pos, "\\");//插入
pos = pos + 2;
}
cout << "修改字符串:" << str << endl;
return 0;
}
Output:
原始字符串:C:\book\1.txt
修改字符串:C:\\book\\1.txt
3.3.2 自己写函数实现
#include <iostream>
#include <string>
using namespace std;
//backslash to double backslash
//个人觉得这种方法效率最高,最多也就一次循环就结束了
//insert也会申请临时变量,,可能要使用多次
string bs_to_dbs(string str) {
string str_temp;
for (int i = 0; i < str.size(); i++) {
str_temp.push_back(str[i]);
if (str[i] == '\\')
str_temp.push_back(str[i]);
}
return str_temp;
}
//backslash to double backslash version-2
string bs_to_dbs_v2(string str) {
for (int i = 0; i < str.size(); i++) {
if (str[i] == '\\') {
str = str.insert(i + 1, 1, '\\');
i = i + 1;
}
}
return str;
}
int main()
{
string str = "C:\\book\\1.txt";
string str_temp = bs_to_dbs(str);
string str_temp2 = bs_to_dbs_v2(str);
cout << "原始字符串:" << str << endl;
cout << "入栈方法修改:" << str_temp << endl;
cout << "插入方法修改:" << str_temp << endl;
return 0;
}
4.相关链接
1.c++11 - Can you combine the raw string modifier R"()" with a string variable? - Stack Overflow
2.The Complete Guide to Building Strings In C++: From “Hello World” Up To Boost Karma - Fluent C++
3.python - Add ‘u’ prefix to string - Stack Overflow
BText:这是对于编程语言理解不够深刻的弊端,分不清它可以做什么,不可以做什么,是不知道的,C++的路,还有很远,加油吧!!!!