转义序列--PTA实验C++

本文介绍了如何模仿C++的规则,实现一个函数escade(),处理包含转义序列的字符串,如换行符、制表符和引号等,并展示了C++代码实现过程以及样例输入输出
摘要由CSDN通过智能技术生成

一、题目描述

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

}

}

四、测试详情

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xixixiLucky

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值