热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++与C语言中的字符串

目录1、关于c语言中的字符串(1)c语言中字符串与字符指针(2)字符串结尾2、关于c中的字符串string

目录

1、关于c语言中的字符串

(1)c语言中字符串与字符指针

(2)字符串结尾

2、关于c++中的字符串string

(1)从本质上了解string

(2)c++中的字符串转换与关联

(3)关于字符串中的'\0'

        为了方便对字符串进行操作与弥补c语言对字符串操控的不足,c++推出了string类,并且随着c++不断发展,string类完全可以当做一个容器(vector)进行使用(此处不进步展开)。那么c++中的string与c语言又有那些联系与区别:


1、关于c语言中的字符串


(1)c语言中字符串与字符指针

char* str="hello!";

         本质上:字符指针str指向字符串首地址(也就是首元素的地址),c语言中的字符串存储于全局区(具体来讲是全局区中的常量区),那么问题来了,在c语言中指向的字符串可以改变吗?

答:在c语言中可以改变(为了指针操控地址的方便)

char* str="hello!";
*str='a';

        上述代码改变了首元素的值。

        c++从声明规范了字符串不可以改变,声明字符串前必须加const,如下:

const char* str1="hello";
char* str2="hello";//代码会报错,因为变量存储于常量区,其值不可以改变

        因此可以得出结论:C++中的字符串才是真正的字符串,C语言中的字符串并非严格意义上的字符串。


(2)字符串结尾

        有人好奇,为什么仅仅通过一个字符指针指向字符串的首元素就可以知道整个字符串的值,因为字符串在逻辑内存中连续存储,且以'\0'结尾。

        我们可以通过以下方式进行遍历字符串中的每一个元素:

const char* str="hello";
while(*str!='\0')
{printf("%c\n",*str);
}

        因此进行字符串拷贝时,一定不要忘记'\0'也需要占一个字节空间,空间需要扩充一个字节:

const char* str="hello";
char* str1=(char*)malloc(strlen(str)+1);

        于是有人好奇,那么字符数组是否也是以'\0'结尾?

答:并不是,字符数组通过数组的数目可以知道整个字符串的值,因此完全没有必要这样做
另外:字符数组是在栈区开辟空间,并不是在常量区!

        我们可以通过以下例子来进一步来证明我们的猜想:

char ch[] = { &#39;h&#39;,&#39;e&#39;,&#39;l&#39;,&#39;l&#39;,&#39;o&#39; };cout <

输出如下:

 


2、关于c++中的字符串string


(1)从本质上了解string

        string其实是c++中标准库的一个类,不过该类确实很“聪明”与“灵活”,既可以当做一个类来使用,也可以当做一个容器来使用(begin(),end()……等模板容器中的东西几乎都快要使用,想玩,自己亲自写代码去体会一下,哈哈哈)。

         那么问题来了,c++中的string类是否也是以&#39;\0&#39;结尾?

答:是的,这一点继承了C语言的风格!

        我们来看以下例子:

string str1("hello world!");if (str1[str1.size()] == &#39;\0&#39;){cout <<"该字符串以\\0结尾" <

        输出:


(2)c++中的字符串转换与关联

        我们可以通过string的成员函数:c_str();

string str1("hello world!");const char* str2 = str1.c_str();//注意必须是const,否则报错

        面对const,令人比较棘手,因为我们无法进行修改指针对应的内容,而有时候我们又必须进行修改该内容,那么我们应该怎么办?例如以下函数:

//转为小写字母
string toLowerCase(string s)

因此我们需要建立一个char* str指向s[0],并且建立一个一个零时字符串,如下所示:

//转为小写字母
string toLowerCase(string s)
{string tmp;if (s.empty()){return NULL;}char* str = &s[0];while (*str!=&#39;\0&#39;){if (*str<=&#39;Z&#39;&&*str>=&#39;A&#39;){*str = *str + 32;}tmp.push_back(*str);str++;}return tmp;}

(3)关于字符串中的&#39;\0&#39;

        我们看以下例子:

string str1("hello\0 world!");cout <

        那么输出为什么呢?hello呢还是hello\0 world!?

        因为遇到&#39;\0&#39;自动忽略后面的字符,于是有人好奇,str1的字符长度(不包含&#39;\0&#39;)又为多少呢?

string str1("hello\0 world!");cout <

 最后,送一句话给自己,同时也给每一个奋斗在代码第一线的同志:打破砂锅问到底,你将战无不胜攻无不克!


推荐阅读
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • C语言判断正整数能否被整除的程序
    本文介绍了使用C语言编写的判断正整数能否被整除的程序,包括输入一个三位正整数,判断是否能被3整除且至少包含数字3的方法。同时还介绍了使用qsort函数进行快速排序的算法。 ... [详细]
  • C++语言入门:数组的基本知识和应用领域
    本文介绍了C++语言的基本知识和应用领域,包括C++语言与Python语言的区别、C++语言的结构化特点、关键字和控制语句的使用、运算符的种类和表达式的灵活性、各种数据类型的运算以及指针概念的引入。同时,还探讨了C++语言在代码效率方面的优势和与汇编语言的比较。对于想要学习C++语言的初学者来说,本文提供了一个简洁而全面的入门指南。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
author-avatar
小太郎在路上_439
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有