一、题目描述
C++课程又讲到了字符串中的转义序列,和Java的规则很相似(喂,是Java学的C++,而C++又沿袭了C好吧?)这个转换感觉我也能实现,试试看。
仿照C++的定义对可能含有转义序列的字符串进行转换,输出转换后的结果。
只需实现:\n
, \t
, \?
, \'
, \"
, \\
即可。其他\a \b \f \v
输出来也不容易看效果,咱就不考虑了。
另外\?
好象很无聊,字符串里直接写?
貌似也没问题。于是我上网搜了下,惊奇地发现古时候C/C++曾经支持过一种叫trigraph
的特性,例如在当时??(
三连会被替换成[
字符,原因是某些国家的键盘缺少[ ] { } # \ ^ | ~
等重要字符,好在现已弃用了这个特性,我长舒了一口气。
输入规格
每行一个待转换的字符串,请整行读取并处理,直到EOF为止。
输出规格
依次输出转换后的字符串。行数可能有变化(\n)。
样例输入
new\nline
T\tAB
\?\'\"\\
样例输出
new
line
T AB
?'"\
样例解释
第1行的\n
替换为换行符,使两个单词输出到了不同行。
第2行的\t
替换为制表符,放在"T"与"AB"中间。
第3行是其他转义序列的连续替换。
二、前置知识
1、逐行读取输入端字符串数据,直到下一行没有为止
string s;
while(getline(cin,s)){
}
2、将字符串的每一个字符逐个分离成字符然后逐个判断需要用到for循环和字符串的一个s.at()函数取第x个就s.at(x),x从0开始取(因为for循环中的i从0开始)
for(int i=0;i<s.length();i++){
char c=s.at(i);
3、转义函数 escade():
void escade(string s){
for(int i=0;i<s.length();i++){
char c=s.at(i);//逐个读取字符串的字符
if(c=='\\'){//当读到字符为'\'时开始判断该'\'后面的字符是什么并进行特殊处理
i++;//移到'\'后面的字符
if(i<s.length()){//保证不越界的情况下判断
switch(s[i]){//switch case语句!!一定要加break
case 't':
cout<<'\t';输出'\t'实际上就是输出了制表符
break;
case 'n':
cout<<endl;//也可以写成cout<<'\n';
break;
case '\?':
cout<<"?";//输出真正的要输出的“?”
break;
case '\\':
cout<<'\\';//实际输出\
break;
case '\'':
cout<<"\'";
break;
case '\"':
cout<<"\"";
break;
default:
cout<<"\\";//如果上述情况都不满足,则刚开始的\就是一个普通的字符,要原样输出
cout<<s[i];//并且输出\后面的字符不需要特殊处理也原样输出
}
}
}else{
cout<<c;
}
}
三、完整C++代码实现
#include<iostream>
using namespace std;
void escade(string);
int main(){
string s;
while(getline(cin,s)){
escade(s);
cout<<endl;
}
}
void escade(string s){
for(int i=0;i<s.length();i++){
char c=s.at(i);
if(c=='\\'){
i++;
if(i<s.length()){
switch(s[i]){
case 't':
cout<<'\t';
break;
case 'n':
cout<<endl;
break;
case '\?':
cout<<"?";
break;
case '\\':
cout<<'\\';
break;
case '\'':
cout<<"\'";
break;
case '\"':
cout<<"\"";
break;
default:
cout<<"\\";
cout<<s[i];
}
}
}else{
cout<<c;
}
}
}
四、测试详情