Codewars一些积累No.4 string类对字符串的操作

前言

Emmm…最进由于学校里在学习字符串操作,所以对string模板类对字符串的操作想做一些学习与归纳,也可以顺便作为给同学的答疑。加上之前由于本人之前在字符串处理方面的经验有限,所以在Codewars上欠下了很多关于字符串操作相关实现问题。所以在这里一并解决。一石三鸟,十分舒服。( 其实可以放在STL学习专栏的,不过正好也是在Codewars上面的积累,所以就在这里解决了)

正文

C语言时期的字符串操作方式

在C语言时期的字符串表示与操作形式利用的是字符数组与指针char*, char**, char str[], 与char*str[]:

char str[10] = "hello";
char *str = "hello";
char *str[] = {"hello","world"};
char **strptr = str;

在此处,csdn上有关于对其用法的深刻解读:
https://blog.csdn.net/qq_28351609/article/details/84633393

C++时期对字符串的操作方式

下面才是重头戏。在C++时期,有了STL标准模板库,使得我们能用string类更好的实现我们所要的需求,而且我们不用担心字符串内存于长度的问题。所以现在大家更多选择了string类来操作字符串。

string类的用法

1.声明
	string str1;
    //声明一个空字符串str1
    string str2 = "hello";
    //声明一个字符串str2并初始化为"hello"
    string str3(str2);
    //声明一个字符串str3为str2的复制品
    string str4(str2,1);
    //声明一个字符串str4,并从str2[1]处开始复制
    //此时str4即为:"ello"
    string str5(str2,1,2);
    //声明一个字符串str5,并从str2[1]处开始复制,并且复制长度为2
    //此时str5即为:"el"
    string str6(5,'a');
    //声明一个字符串str6,并且该字符串包含5个字符a
    //此时str6即为:"aaaaa"
    string str7(&str2[1],&str2[4]);
    //声明一个字符串str7,其内容在两个迭代器之间
    //此时str7即为:ell
2.用法

string类中封装了很多方便我们使用的函数,这些函数都非常实用。下面一个个来详细了解一些比较实用的函数:

1)赋值:=,assign()
str1 = str2;		//将str2赋值给str1
str1.assign(str2);	//将str2赋值给str1
str1.assign(5,'a');	//将"aaaaa"赋值给str1
2)插入:insert()
str1.insert(&str1[1],str2);
//将str2插入到str1[1]的位置处
3)元素存取:[ ],at( )
str1[2];	//调用出str1的下标为2的元素
str1.at(2);	//调用出str1的下标为2的元素

两种方式的方法等同,不过用at()还可以检验下标所对应的元素是否存在

4)求字符串的长度:length(),size(),empty()
str1.length();	//返回str1的长度
str1.size();	//返回str1的长度
str1.empty();	//判断str1是否为空

两种方式相同,值得注意的是,返回的长度不包括’\0’

5)添加字符:push_back()
str2.push_back('!');	//在str2后添加字符'!'
//此时str2由"hello"变为"hello!"
6)拼接:+,append()
str1+str2; //将字符串s1和s2拼接
str1.append(str2); //将字符串s2追加到s1后
str1+'a'; //将字符串s1和字符'a'拼接
7)删除:clear(),erase()
str1.clear();	//删除str1的所有字符
str1.erase();	//删除str1的所有字符,返回当前对象
str1.erase(&str1[1]);	//删除从str1[1]开始的所有字符,返回当前对象
8)查找:find(),rfind(),find_first_of(),find_last_of()
str.find('e');			//查找'e'
str.find("ell"); 		//查找 "ell"
str.find('l',1); 		//从第一个位置开始,查找'l'
str.find("ell",1,2); 	//从从第一个位置开始,开始查找"ell"的前2个字符
str.rfing('e');			//反向寻找'e'
str.find_first_of('e');	//查找第一个'e'
str.find_last_of('e');	//查找最后一个'e'

实战演练

1.DNA反码

1)题目内容:

In DNA strings, symbols “A” and “T” are complements of each other, as “C” and “G”. You have function with one side of the DNA (string, except for Haskell); you need to get the other complementary side. DNA strand is never empty or there is no DNA at all (again, except for Haskell).

在DNA字符串中,符号“ A”和“ T”彼此互补,如“ C”和“ G”。您可以对DNA的一侧(字符串,Haskell除外)起作用。您需要获得另一互补的一面。DNA链永远不会为空或根本没有DNA(同样,Haskell除外)。

2)样例
DNA_strand ("ATTGC") # return "TAACG"
DNA_strand ("GTAT") # return "CATA"
3)代码实现:
#include <string>

std::string DNAStrand(const std::string& dna)
{
    int length = dna.length();
    std::string rdna;
    for (int i = 0; i < length ; ++i) {
        switch (dna[i]) {
            case 'T':
                rdna.push_back('A');
                break;
            case 'A':
                rdna.push_back('T');
                break;
            case 'G':
                rdna.push_back('C');
                break;
            case 'C':
                rdna.push_back('G');
        }
    }
    return rdna;
  //your code here
}

由于题目较简单,所以在代码中未加注释。

2.取中间字符串

1)题目内容

You are going to be given a word. Your job is to return the middle character of the word. If the word’s length is odd, return the middle character. If the word’s length is even, return the middle 2 characters.

您将得到一个单词。您的工作是返回单词的中间字符。如果单词的长度是奇数,请返回中间字符。如果单词的长度是偶数,请返回中间的2个字符。

2)样例
Kata.getMiddle("test") should return "es"
Kata.getMiddle("testing") should return "t"
Kata.getMiddle("middle") should return "dd"
Kata.getMiddle("A") should return "A"
3)代码实现
std::string get_middle(std::string input)
{
    int Num = input.length();
    std::string output;
    if (Num&1)
        output.push_back(input[Num/2]);
    else{
        output.push_back(input[Num/2-1]);
        output.push_back(input[Num/2]);}
    return output;
    // return the middle character(s)
}

这个用例也比较基础,所以就不再旁边批注详解了,各位自行体会。

尾声

今天花了一些时间来整理一些自己认为有用的string类操作,并且列出了我认为最为实用的一些操作方法,虽然可能不是特别全面,但大部分情况已经够用了。希望能对各位在学C++初期的同学有所帮助,创作不易,麻烦点个赞呗!
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值