C++中 string 中的常用方法使用心得

string 字符串在所有的语言中都非常重要,c++也不例外,接下来我们将介绍string中的常用方法

1. size() 和 length() 函数 : 他们返回字符串的真实长度,且不会因为空格而截断,这两个方法完全等价,使用及输出如下:

#include<iostream>
#include<string>
using namespace std;

int main(void)
{
  string s = "dasddasd";
  printf("size()返回的长度为:%lu\nlength()返回的长度为:%lu",s.size(),s.length());
  return 0;
}

2. find()函数和rfind()函数 : 这两个函数用于查找字串在母串中的位置,并且返回该位置,当然如果找不到就会返回一个特别的标记string::nops,而find()函数是从字符串开始指针向后进行查找,rfind()函数是从字符串的结束指针开始向前查找,其使用及输出如下:

#include<iostream>
#include<string>
using namespace std;

int main(void)
{
  string s = "hello worldh";
  int index = s.find("h");   // 从串首向后查找
  int index2 = s.find("h",2)  // 固定位置后子串在母串的位置
  int index1 = s.rfind("h"); // 从串尾向前查找
  printf("(find()):字母h在母串中的位置为:%d\n", index);
  printf("(rfind()):字母h在母串中的位置为:%d", index1);
  return 0;
}

值得注意的是我们可以通过组合使用这两个函数来实现判断该子串是否唯一存在于母串中,其实现代码如下:

#include<iostream>
#include<string>
using namespace std;

inline bool whetherOnly(string &str,string &base){
  return base.find(str) == base.rfind(str);
}

3. find_last_of()函数和find_first_of()函数:从函数名我们也可以知道find_last_of()函数是找这个子串在母串中最后一次出现的位置并且将该位置返回;而find_first_of()函数是找这个子串在母串中最后一次出现的位置并将该位置返回,其使用及输出如下:

#include <iostream>
#include <string>
using namespace std;

int main(void)
{
  string s = "hello worldh";

  int index = s.find_first_of("h");
  int index1 = s.find_last_of("h");
  printf("(find_first_of()):字母h在母串中的位置为:%d\n", index);
  printf("(find_last_of()):字母h在母串中的位置为:%d", index1);
}

4.assign()函数:该函数用于将目标串的值复制到该串上,并且只复制值,其使用及输出如下:

#include <iostream>
#include <string>
using namespace std;

int main(void)
{
  string s = "hello worldh";
  s.clear();
  s.assign("hello world");
  cout<<s<<endl;

}

5.clear()函数,把当前字符串清空,这时候如果调用string::size()函数或string::length()函数将返回0,其使用及输出如下:

#include <iostream>
#include <string>
using namespace std;

int main(void)
{
  string s = "hello worldh";
  s.clear();
  cout<<"clear后的串的长度"<<s.size()<<endl;
}

6.resize()函数,该函数可以将字符串变长到指定长度,若小于原本字符串的长度,则会截断原字符串;这个函数的一个重载形式是str.resize(length,'s') 可以用该输入字符's'来对字符串进行扩充至length的长度,该函数的使用及输出如下:

#include <iostream>
#include <string>
using namespace std;

int main(void)
{
  string s = "hello worldh";
  s.resize(5);    // s会变为 hello
  cout<<s<<endl;
  s.resize(10,'C'); // s 会变为 helloCCCCC
  cout<<s<<endl;

}

7. replace(pos,len,dist)函数: 该函数用于将该串从pos位置开始将长度为len的字串替换为dist串,值得注意的是该函数只替换一次,这与市面上的py和java等语言不一样,需要留意,该函数的使用和输出如下:

#include <iostream>
#include <string>
using namespace std;

int main(void)
{
  string s = "hello worldh";
  s.replace(s.find("h"),2,"#"); // 把从第一个h开始的两个字符变为一个字符 #
  cout<<"替换后的字符串为: "<<s<<endl;

}

那么既然C++本身不提供,替换所有子串的函数,我们就自己实现一个,其代码如下:

// 替换字符串里的所有指定字符
string replace(string &base, string src, string dst) //base为原字符串,src为被替换的子串,dst为新的子串
{
  int pos = 0, srclen = src.size(), dstlen = dst.size();
  while ((pos = base.find(src, pos)) != string::npos)
  {
    base.replace(pos, srclen, dst);
    pos += dstlen;
  }
  return base;
}

8. erase(index,length)函数:该函数删除index位置后length长度的子串,其代码及输出如下:

#include <iostream>
#include <string>
using namespace std;

int main(void)
{
  string s = "hello worldh";
  s.erase(s.find("h"),3);
  cout<<"擦除过后的串"<<s<<endl; // 将会输出lo worldh
}

9.substr(index,length)函数:该函数从index开始截断到长度为length并返回截断的子串;值得注意的是,该函数不改变母串的值,其使用及输出如下:

#include <iostream>
#include <string>
using namespace std;

int main(void)
{
  s = s.substr(0,5);
  cout<<"截断并赋值后的字符串为:"<<s<<endl; // 会输出hello
}

10 . push_back(char c)函数,pop_back()函数,append(string s)函数:push_back(char c)函数往该字符串的尾端加入一个字符;pop_back()函数从该字符串的尾端弹出一个字符;而apend(string s)函数将会在该字符串的末尾添加一个字符串,并且返回添加后字符串的引用。他们的使用及输出如下图所示:

#include <iostream>
#include <string>
using namespace std;

int main(void)
{
  string s = "hello worldh";
  // s.erase(s.find("h"),3);
  s.pop_back(); //弹出串的最后一个元素
  cout<<"弹出串尾元素后的字符串为: "<<s<<endl;
  s.push_back('s'); // 在串的最后添加一个字符
  cout<<"往串尾添加字符后的字符串为: "<<s<<endl;
  s.append("hhh"); // 在串的最后添加一个字符串
  cout<<"往串尾添加字符串后的字符串为: "<<s<<endl;
}

以上就是string中比较重要的函数的全部内容了,既然我们学完了该内容,那我们接下来做一条题来熟悉一下这些函数中的一些吧(题目与代码如下代码块,题目出自leetcode):

// 给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。
// 假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。

// 注意:每次拼写时,chars 中的每个字母都只能用一次。
// 返回词汇表 words 中你掌握的所有单词的 长度之和。

// 输入:words = ["cat","bt","hat","tree"], chars = "atach"
// 输出:6
// 解释:
// 可以形成字符串 "cat" 和 "hat",所以答案是 3 + 3 = 6。

// 输入:words = ["hello","world","leetcode"], chars = "welldonehoneyr"
// 输出:10
// 解释:
// 可以形成字符串 "hello" 和 "world",所以答案是 5 + 5 = 10。

#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Solution
{
public:
  int countCharacters(vector<string> &words, string chars)
  {
    int count = 0;
    bool flag = false;           // 标记
    string c_chars(chars);         // 构造c_chars保存chars
    for (int i = 0; i < words.size(); i++) // 迭代单词表
    {
      if (c_chars.size() < words[i].size()) //如果单词的字母多于可选字母,则跳过这个单词
        continue;
      for (int j = 0; j < words[i].size(); j++) // 迭代可选择的字母
      {
        int index = c_chars.find(words[i][j]);
        if (index != c_chars.npos) // 能找到这个字母
        {
          flag = true;
          c_chars.erase(index, 1); // 从c_chars()删除这个字母
        }
        else
        {
          flag = false; // 不能找到,意味着不能组成这个单词
          break;    //跳出这次循环
        }
      }
      if (flag) // 如果符合则计数加1
        count += words[i].size();
      c_chars.assign(chars); // 把chars的值在再次赋值给c_chars
    }
    return count;
  }
};

最后感谢大家的阅读,string中这些的函数组合起来可以说是威力无穷,所以还是要好好掌握的。

总结

到此这篇关于C++中 string 中的方法的使用详解(心得)的文章就介绍到这了,更多相关C++ string方法使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2020-03-26

c++ int转string方法

复制代码 代码如下: /************************************************************************/ /* int to string */ /************************************************************************/ std::string CCardDispatcher::ItoA(int n){ char ss[16]; //这个长度根据需要吧 sp

对C++ string append方法的常用用法详解

C++ string append()添加文本 使用append()添加文本常用方法: 直接添加另一个完整的字符串: 如str1.append(str2); 添加另一个字符串的某一段子串: 如str1.append(str2, 11, 7); 添加几个相同的字符: 如str1.append(5, '.'); 注意,个数在前字符在后.上面的代码意思为在str1后面添加5个".". //======================================== #include<

详解C++ string常用截取字符串方法

string常用截取字符串方法有很多,但是配合使用以下两种,基本都能满足要求: find(string strSub, npos); find_last_of(string strSub, npos); 其中strSub是需要寻找的子字符串,npos为查找起始位置.找到返回子字符串首次出现的位置,否则返回-1: 注: (1)find_last_of的npos为从末尾开始寻找的位置. (2)下文中用到的strsub(npos,size)函数,其中npos为开始位置,size为截取大小 例1:直接查

C++ 读文件 将文件内容读入到字符串string中的方法

如下所示: #include <string> #include <fstream> #include <sstream> #include <iostream> #include <stdlib.h> using namespace std; //从文件读入到string里 string readFileIntoString(char * filename) { ifstream ifile(filename); //将文件读入到ostring

c++ String去除头尾空格的方法

本文实例讲述了c++ String去除头尾空格的方法,分享给大家供大家参考.具体实现方法如下: 实现该功能可使用string的find_first_not_of,和find_last_not_of方法,具体实现带如下: 复制代码 代码如下: #include <iostream> #include <string> std::string& trim(std::string &); int main() {     std::string s = " He

C++实现string存取二进制数据的方法

本文实例讲述了C++实现string存取二进制数据的方法,分享给大家供大家参考.具体方法分析如下: 一般来说,STL的string很强大,用起来也感觉很舒服,这段时间在代码中涉及到了用string存取二进制数据的问题,这里记录一下,以供以后参考. 首先提一下STL中string的参考资料:http://www.cplusplus.com/reference/string/string/ ,不懂的朋友可以看下. 在数据传输中,二进制数据的buffer一般用系统预设的大数组进行存储,而不是STL的s

C++中CString string char* char 之间的字符转换(多种方法)

首先解释下三者的含义 CString 是一种很有用的数据类型.它们很大程度上简化了MFC中的许多操作(适用于MFC框架),使得MFC在做字符串操作的时候方便了很多.需要包含头文件#include <afx.h> C++是字符串,功能比较强大.要想使用标准C++中string类,必须要包含#include <string>// 注意是<string>,不是<string.h>,带.h的是C语言中的头文件.Char * 专门用于指以'\0'为结束的字符串. 以下

使用C++中string实现任意长度的正小数、整数之间加减法方法实例

一.概述 C/C++中的int类型能表示的范围是-2E31-2E31–1.unsigned类型能表示的范围是0-2E32–1,即 0-4294967295.所以,int和unsigned类型变量,都不能保存超过10位的整数.有时我们需要参与运算的数,可能会远远不止10 位,例如,可能需要保留小数点后面100位(比如求π的值),那么,即便使用能表示很大数值范围的double变量,但是由于double变量只有64位,所以还是不可能达到精确到小数点后面100位这样的精度.double变量的精度也不足以

vuejs中父子组件之间通信方法实例详解

本文实例讲述了vuejs中父子组件之间通信方法.分享给大家供大家参考,具体如下: 一.父组件向子组件传递消息 // Parent.vue <template> <div class="parent"> <v-child :msg="message"></v-child> </div> </template> <script> import VChild from './child.v

Java中String.format的使用方法总结

Java中String.format的用法总结 1.对整数进行格式化:%[index$][标识][最小宽度]转换方式 我们可以看到,格式化字符串由4部分组成,其中%[index$]的含义我们上面已经讲过,[最小宽度]的含义也很好理解,就是最终该整数转化的字符串最少包含多少位数字.我们来看看剩下2个部分的含义吧: 标识: '-' 在最小宽度内左对齐,不可以与"用0填充"同时使用 '#' 只适用于8进制和16进制,8进制时在结果前面增加一个0,16进制时在结果前面增加0x '+' 结果总是

Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例

本文实例讲述了python从任意长度的可迭代对象中分解元素操作.分享给大家供大家参考,具体如下: 从某个可迭代对象中分解出N个元素,但是可迭代对象的长度可能超过N,会出现"分解值过多"的异常: 使用"*表达式"来解决该问题: Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32 Type "copyright",

java中String的常见用法总结

1>获取  1.1:字符串中包含的字符数,也就是字符串的长度.  int length():获取长度 1.2:根据位置获取位置上某个字符.  char charAt(int index) 1.3:根据字符获取该字符在字符串中的位置.  int indexOf(int ch):返回的是ch在字符串中第一次出现的位置.  int indexOf(int ch,int fromIndex):从fromIndex指定位置开始,获取ch在字符串中出现的位置. int indexOf(String str)

从内存方面解释Java中String与StringBuilder的性能差异

以前经常在网上看到关于Java字符串拼接等方面的讨论.看到有些Java开发人员在给新手程序员的建议中类似如下写道: 不要使用+号拼接字符串,要使用StringBuffer或StringBuilder的append()方法来拼接字符串. 不过,用+号拼接字符串就真的那么令人讨厌,难道使用+号拼接字符串就没有一点可取之处吗? 通过查阅Java API文档中关于String类的部分内容,我们可以看到如下片段: "Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串

python中string模块各属性以及函数的用法介绍

任何语言都离不开字符,那就会涉及对字符的操作,尤其是脚本语言更是频繁,不管是生产环境还是面试考验都要面对字符串的操作. python的字符串操作通过2部分的方法函数基本上就可以解决所有的字符串操作需求: • python的字符串属性函数 • python的string模块 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1.字符串属性函数  系统版本:CentOS release 6.2 (Final)2.6.32-220.

C字符串与C++中string的区别详解

在C++中则把字符串封装成了一种数据类型string,可以直接声明变量并进行赋值等字符串操作.以下是C字符串和C++中string的区别:  C字符串 string对象(C++) 所需的头文件名称  <string>或<string.h> <string>或<string.h> 需要头文件 原因 为了使用字符串函数 为了使用string类 声明 方式 char name[20]; string name; 初始化方式 char name[20]="

JAVA中String类与StringBuffer类的区别

在Java中有两种字符串的操作:String类和StringBuffer类(缓冲字符串处理类). 下面先简单的说一下两者的区别. String类和StringBuffer类都提供了相应的方法实现字符串的操作,但二者略有不同. (1) String类 该类一旦产生一个字符串,其对象就不可变.String类的内容和长度是固定的.如果程序需要获得字符串的信息需要调用系统提供的各种字符串操作方法实现.虽然通过各种系统方法可以对字符串施加操作,但这并不改变对象实例本身,而是生成一个新的实例.系统为Stri

java中判断字段真实长度的实例(中文2个字符,英文1个字符)

实例如下: public class Char_cn { public static void main(String[] args) { // TODO Auto-generated method stub String haha = "我叫兜兜abcd"; int true_num = String_length(haha); System.out.println("true" + true_num); int false_num = haha.length()