01-0004关于C/C++中的转义字符(•́へ•́╬)

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.问题分析

  1. 想着不让编译器解释转义字符,就如同让编译器失职,不可能的,思想上有问题,如果这样想,还不如自己出一个编译器。
  2. 想着用一种非常偏僻的方式去给字符串变量添加R前缀,后者转化为原始字符串,这种想法就好像是某人脑子里面知道“1+1=2”,却偏要相同“1>1=2”要怎么解释,怎么写,怎么运行才是对的。【你现在所做的事情,方向是错的,你想实现一个C/C++不支持的操作;结果是差的,因为根本不存在这种语法;过程是悲惨的,没想到吧,其他语言中有的支持这样操作,而且没人告诉你C++它不可以这样操作。】
  3. 再看这个问题,为什么会手动定义一个字符串,用它存储路径的时候使用反斜杠?这不明显是错误的吗?刚学的时候知道修改成双反斜杠?为什么现在要死在这个点上?
  4. 再者,从输入中读取的反斜杠,在存储的时候会自动转化为双反斜杠,没有必要刻意的处理,这些都是编译器以及编程语言规定好的,运行了几十年没有问题,到了自己这却想着怎么才能颠覆前人?这是错的!

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++的路,还有很远,加油吧!!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章