C++字符数组、字符数组指针和string类

目录
  • 1、字符数组和字符数组的指针
  • 2、标准库string类
  • 3、补充
    • 3.1C++自带string类的常用方法

C++中字符串的表示方式有很多种,根据自己目前掌握的有三种:

  • 字符数组;
  • 字符数组指针;
  • 标准库string类;

上面几种方式各有优点和缺点,按照自己的观点,如果处理的字符串的任务比较简单,则使用前两种方法所占用内存小,因而较为实用;如果需要进行字符串拼接和比较等功能,则使用string类比较合适,因为字符数组不含有处理函数。

1、字符数组和字符数组的指针

定义字符数组即使用char类型,字符数组的声明和初始化例子如下:

char duckWords[5] = "Eat";

给字符数组定义指针的语法如下,字符数组名依旧表示首地址:

char *pointerWords = duckWords;

字符数组和字符数组指针的使用方式,和普通数组与普通数组指针的使用方式完全相同:

printf("%c \n", duckWords[5]);
printf("%c \n", *pointerWords);

需要注意的是,字符串的以“\0”结尾,所以对于“Say it”这个字符串实际上含有7个字符,因为表示字符串结尾标志的”\0“是自动添加的。此外,字符串创建含有多种语法,比较重要的一点是初始化时可以不指定数组长度:

char duckName[6]={'D','a','v', 'i', 'd'};
char duckName[6]="David";
char duckName[] = "David";

2、标准库string类

从面向对象的角度看,string类才是更符合字符串操作的。必须注意,string是一个类而不是基本数据类型。

string类的功能主要体现在下面三个发面:

  • 含有多个构造函数,所以能采用多种方式进行初始化;
  • 包含众多的重载操作符;
  • 多种用于字符串处理的成员函数;

下面的第一个例子采用“+”运算符进行字符串拼接:

string duckName = "David";
string duckAge = " 12";
 string duckDescribe = duckName + duckAge;
 /// 需要使用string.c_str()才能输出完整字符串
 printf("%s \n", duckDescribe.c_str());

第二个例子是使用string的成员函数length()进行字符串长度统计:

string duckName = "David";
printf("%d \n", duckName.length());

当然,string类重载的操作符和含有的成员函数还有很多,但是使用方法都是类似的,不属于语法范畴,所以不做具体介绍。

3、补充

3.1C++自带string类的常用方法

  #include<iostream>
   #include<string>
   using namespace std;
   
   int main()
   {
       string str1 = "hello";
       string* str2 = new string("hello");
      string str3 = "world";
 
     //获取字符串长度
     int length = str1.length();
     cout << "调用str.length()函数获取字符串长度:" << length << endl;
     cout << endl;
  
  
     //字符串连接
      string str4 = str1 + str3;
      cout << "字符串连接结果:" << str4 << endl;
      cout << endl;
  
  
      //字符串比较
      if (str1 < str3)
          cout << "字符串比较:" << "str1<str2" << endl;
      cout << endl;

      //获取字符串的第一个字符
      string::const_iterator it = str1.begin();
      cout << *it << endl;
      cout << endl;
  
  
      //获取字符串的最后一个字符
     it = str1.end();//end是指向最后一个字符后面的元素,而且不能输出,所以cout << *it << endl;这样输出会报错
      it--;
      cout << *it << endl;
      cout << endl;
 
  
    //倒置串
     reverse(str1.begin(), str1.end());
   cout << "倒置串:" << str1 << endl;
    cout << endl;
 
    //字符串转字符数组
     //不推荐的用法,但是需要了解
    string a = "abc123";
     const char *b;//这里必须为const char *,不能用char *,不然下一句会报错
     b = a.c_str();
     cout << "a:" << a << endl;
     cout << "b:" << b << endl;
     a = "asd456";
     cout << "a:" << a << endl;
     cout << "b:" << b << endl;
      //推荐用法
      string c = "abc123";
     char *d = new char[20];
      strcpy(d, c.c_str());//因为这里没有直接赋值,所以指针类型可以不用const char *
    cout << "c:" << c << endl;
      cout << "d:" << d << endl;
     c = "asd456";
      cout << "c:" << c << endl;
    cout << "d:" << d << endl;
    cout << endl;

  
      //查找串
     //find-从指定位置起向后查找,直到串尾
      string st1("babbabab");
    cout << st1.find('a') << endl;//1,默认从位置0(即第1个字符)开始查找
     cout << st1.find('a', 2) << endl;//4   在st1中,从位置2(b,包括位置2)开始,查找a,返回首次匹配的位置
     cout << (st1.find('c', 0) == -1) << endl;//1 
      cout << (st1.find('c', 0) == 4294967295) << endl;//1   两句均输出1,原因是计算机中-1和4294967295都表示为32个1(二进制)
     string st2("aabcbcabcbabcc");
     str1 = "abc";
     cout << st2.find(str1, 2) << endl;//6,从st2的位置2(b)开始匹配,返回第一次成功匹配时匹配的串(abc)的首字符在st2中的位置,失败返回-1
      cout << st2.find("abcdefg", 2, 3) << endl;//6   取abcdefg得前3个字符(abc)参与匹配,相当于st2.find("abc", 2)
 
      //rfind-从指定位置起向前查找,直到串首
     cout << st1.rfind('a', 7) << endl;//6
  
     //find_first_of-在源串中从位置pos起往后查找,只要在源串中遇到一个字符,该字符与目标串中任意一个字符相同,就停止查找,返回该字符在源串中的位置;若匹配失败,返回-1
      string str6("bcgjhikl");
     string str7("kghlj");
     cout << str6.find_first_of(str7, 0) << endl;//2,从str1的第0个字符b开始找,g与str2中的g匹配,停止查找,返回g在str1中的位置2
     
     //find_last_of-与find_first_of函数相似,只不过查找顺序是从指定位置向前
     string str("abcdecg");
     cout << str.find_last_of("hjlywkcipn", 6) << endl;//5,从str的位置6(g)开始向前找,g不匹配,再找c,c匹配,停止查找,返回c在str中的位置5
     //find_first_not_of-在源串中从位置pos开始往后查找,只要在源串遇到一个字符,与目标串中的任意字符都不相同,就停止查找,返回该字符在源串中的位置;若遍历完整个源串,都找不到满足条件的字符,则返回-1
     cout << str.find_first_not_of("kiajbvehfgmlc", 0) << endl;//3   从源串str的位置0(a)开始查找,目标串中有a,匹配,..,找d,目标串中没有d(不匹配),停止查找,返回d在str中的位置3
  
      //find_last_not_of-与find_first_not_of相似,只不过查找顺序是从指定位置向前
     cout << str.find_last_not_of("kiajbvehfgmlc", 6) << endl;//3
 
     system("pause");
     return 0;
 
 }

 运行结果:

到此这篇关于C++字符数组、字符数组指针和string类的文章就介绍到这了,更多相关C++字符数组和string类内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++中的string类(C++字符串)入门完全攻略

    前言 string 类是 STL 中 basic_string 模板实例化得到的模板类.其定义如下: typedef basic_string <char> string; basic_string 此处可以不必深究. string 类的成员函数有很多,同一个名字的函数也常会有五六个重载的版本.篇幅所限,不能将这些原型一一列出并加以解释.这里仅对常用成员函数按功能进行分类,并直接给出应用的例子,通过例子,读者可以基本掌握这些成员函数的用法. 要想更深入地了解 string 类,还要阅读 C++

  • C++变量,常量,数组和字符串详解

    目录 一.内存和寻址概述 二.变量 1.声明变量 2.变量的作用域 2.1 局部变量 2.2 全局变量 3.c++变量类型 3.1.bool布尔类型 3.2 char字符型 4.常量 总结 一.内存和寻址概述 可编程设备包含微处理器和一定数量的临时存储空间.临时存储器被称为随机存取存储器(RAM). RAM类似于宿舍里成排存物柜的存储区域,每个存物柜都有编号,即地址.要访问特定的内存单元,需要使用指令要求处理器从这里获取值或写入值. 微处理器负责执行应用程序,并从RAM中获取要执行的应用程序以及

  • 解析C++中的字符串处理函数和指针

    C++字符串处理函数 字符串连接函数 strcat 其函数原型为 strcat(char[],const char[]); strcat是string catenate(字符串连接)的缩写.该函数有两个字符数组的参数,函数的作用是:将第二个字符数组中的字符串连接到前面字符数组的字符串的后面.第二个字符数组被指定为const,以保证该数组中的内容不会在函数调用期间修改.连接后的字符串放在第一个字符数组中,函数调用后得到的函数值,就是第一个字符数组的地址.例如: char str1[30]=″Peo

  • 总结C/C++面试中可能会碰到的字符串指针题

    前言 不知道大家有没有这种体会,很多面试题看似简单,却需要深厚的基本功才能给出完美的解答.企业要求面试者写一个最简单的strcpy函数都可看出面试者在技术上究竟达到了怎样的程度,我们能真正写好一个strcpy函数吗?我们都觉得自己能,可是我们写出的strcpy很可能只能拿到10分中的2分.读者可从本文看到 strcpy函数从2分到10分解答的例子,看看自己属于什么样的层次.此外,还有一些面试题考查面试者敏捷的思维能力. 分析这些面试题,本身包含很强的趣味性;而作为一名研发人员,通过对这些面试题的

  • 详解C++的String类的字符串分割实现

    详解C++的String类的字符串分割实现 功能需求,输入一个字符串"1-2-3"切割出"1"."2"."3".在Java下直接用String的split函数就可以了.c++下String没有直接提供这个函数,需要自己写. 网上给出的解决方案是这里的三种方法.但我是通过JNI访问的,在里面用这些vector可能不中,自己封装了个,仅供参考: String recogScop = "01-02-03"; co

  • C++中字符串以及数组和指针的互相使用讲解

    C++字符串与指针 在C++中可以用3种方法访问一个字符串(在第5章介绍了前两种方法). 用字符数组存放一个字符串 [例]定义一个字符数组并初始化,然后输出其中的字符串. #include <iostream> using namespace std; int main( ) { char str[]="I love CHINA!"; cout<<str<<endl; return 0; } 运行时输出: I love CHINA! 用字符串变量存放

  • 关于C++ string和c类型字符数组的对比

    在c++中string是很方便操作的字符串,支持多种算数运算和比较运算,操作起来非常灵活.string也具有一些容器的性质,可以通过迭代器对字符元素进行访问 c类型的字符数组有如下三种初始化方式: //前两种的初始化方式是等同的,最后一种没有'\0' char *cp="hello"; char c_arr[]="hello"; char c_arr2[]={'h','e','l','l','o'}; 这三种定义c字符串的方式,其中前两种虽然形式不一样但含义是一摸一

  • 详解C++ string字符串类

    C++字符串string类 在C语言里,字符串是用字符数组来表示的,而对于应用层而言,会经常用到字符串,而继续使用字符数组,就使得效率非常低. 所以在C++标准库里,通过类string从新自定义了字符串. 头文件: #include <string> string直接支持字符串连接 string直接支持字符串的大小比较 string直接支持子串查找和提取 string直接支持字符串的插入和替换 string同时具备字符串数组的灵活性,可以通过[ ]重载操作符来访问每个字符. 字符串数组和str

  • C++ 将字符串值赋给CHAR数组的实现

    我就废话不多说啦,大家还是直接看代码吧~ CHAR name[50]; strcpy(name, "tagname"); 补充:将char* 赋值给std::string的一些陷阱 这段时间,总是要使用char或者char* 赋值给std::string,踩了不少坑.于是写了个测试代码,如果你不想看我的代码,可以跳到下面直接看总结: #include <string> #include <iostream> using namespace std; int ma

  • C++字符数组、字符数组指针和string类

    目录 1.字符数组和字符数组的指针 2.标准库string类 3.补充 3.1C++自带string类的常用方法 C++中字符串的表示方式有很多种,根据自己目前掌握的有三种: 字符数组: 字符数组指针: 标准库string类: 上面几种方式各有优点和缺点,按照自己的观点,如果处理的字符串的任务比较简单,则使用前两种方法所占用内存小,因而较为实用:如果需要进行字符串拼接和比较等功能,则使用string类比较合适,因为字符数组不含有处理函数. 1.字符数组和字符数组的指针 定义字符数组即使用char

  • C++中的string类的用法小结

    相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯定的.也许有人会说,即使不用MFC框架,也可以想办法使用MFC中的API,具体的操作方法在本文最后给出操作方法.其实,可能很多人很可能会忽略掉标准C++中string类的使用.标准C++中提供的string类得功能也是非常强大的,一般都能满足我们开发项目时使用.现将具体用法的一部分罗列如下,只起一个

  • 详解Java中String类的各种用法

    目录 一.创建字符串 二.字符.字节与字符串的转换 1.字符与字符串的转换 2.字节与字符串的转换 三.字符串的比较 1.字符串常量池 2.字符串内容比较 四.字符串查找 五.字符串替换 六.字符串拆分 七.字符串截取 八.String类中其它的常用方法 九.StringBuffer 和 StringBuilder 1.StringBuilder与StringBuffer的区别 2.StringBuilder与StringBuffer常用的方法 十.对字符串引用的理解 一.创建字符串 创建字符串

  • Java中char数组(字符数组)与字符串String类型的转换方法

    本文实例讲述了Java中char数组(字符数组)与字符串String类型的转换方法.分享给大家供大家参考,具体如下: 在Java语言编程时,使用"口令字段"jPasswordField组件时,如果要获得密码值,就需要使用该组件的getPassword()方法.jPasswordField的getPassword()方法返回一个char类型的数组,我们经常需要将这个数组转换为String类型,以便进行诸如口令匹配或口令赋值等操作.这时,就需要将char类型的数组进行转换.当然也经常会遇到

  • Java中将String类型依照某个字符分割成数组的方法

    将下列字符串,依照|拆分成数组: String numbers = "1|2|3|4|5"; 使用split拆分 String[] numberArray = numbers.split("\\| "); 以上这篇Java中将String类型依照某个字符分割成数组的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们. 您可能感兴趣的文章: java 字符串分割的三种方法(总结) Java中分割字符串的两种方法实例详解 java Stri

  • Java中字符数组、String类、StringBuffer三者之间相互转换

    一.StringBuffer与String的相互转换 1.将StringBuffer转换成String StringBuffer类成员toString函数可将其转换成String类型. StringBuffer buffer = newStringBuffer("abcd"); String str = buffer.toString(); 通过String类中的构造将一个StringBuffer类转换为String类:String(StringBuffer buffer) Strin

  • C语言字符串替换:字符,字符串,字符数组详解

    目录 案例描述 案例分析 必备知识 1,字符数组 (1)字符数组的定义 (2)字符数组的初始化 2,字符串概念 (1)字符串的概念 (2)用字符初始化字符数组 (3)获取字符串的长度 3,字符串与指针 4,字符数组与字符指针 总结 案例描述 字符串替换是处理字符串时最常见的操作之一,也是学习字符串必须掌握的知识.本案例要求通过编程实现字符串"Good moring"到"Good evening"的转换. 案例分析 我们需要从字符串中被替换的位置开始,将要替换的内容逐

  • php把字符串指定字符分割成数组的方法

    实例如下: <?php $str="1|2|3|4|5|"; $var=explode("|",$str); print_r($var); ?> $var=explode("|",$str); 把$str按|进行分割 php还有其他的把字符串指定字符分割成数组 str_split(string,length) 参数 描述 string 必需.规定要分割的字符串. length 可选.规定每个数组元素的长度.默认是 1. json_de

  • 探讨C++中数组名与指针的用法比较分析

    指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用.但是数组名有些地方又不同于指针.这里将数组名与指针用法的不同做一下总结(有些资料来自互联网),不妥之处,还望指正!(本文程序在WIN32平台下编译):1.数组名和指向那个数组的指针,地址相同,但大小不同用例子来说明: 复制代码 代码如下: #include "stdafx.h"#include <iostream>using namespace std;int _tmain(int

  • 详解C++数组和数组名问题(指针、解引用)

    目录 一.指针 1.1 指针变量和普通变量的区别 1.2 为什么需要指针 1.3 指针使用三部曲 二.整形.浮点型数组 2.1 数组名其实是特殊的指针 2.2 理解复杂的数组的声明 2.3 数组名a.数组名取地址&a.数组首元素地址&a[0].指向数组首元素的指针*p 2.4 对数组名以及取值符&的理解 三.字符数组数组名 一.指针 1.1 指针变量和普通变量的区别 指针:指针的实质就是个变量,它跟普通变量没有任何本质区别.指针完整的应该叫指针变量,简称为指针. 是指向的意思.指针

随机推荐