c++字符串

C++ 字符串

C++ 提供了以下两种类型的字符串表示形式:

  • C 风格字符串
  • C++ 引入的 string 类类型

C 风格字符串

C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。

下面的声明和初始化创建了一个 RUNOOB 字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 RUNOOB 的字符数多一个。

char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};

依据数组初始化规则,您可以把上面的语句写成以下语句:

char site[] = "RUNOOB";

以下是 C/C++ 中定义的字符串的内存表示:

其实,您不需要把 null 字符放在字符串常量的末尾。C++ 编译器会在初始化数组时,自动把 \0 放在字符串的末尾。让我们尝试输出上面的字符串:

实例

#include <iostream>
 
using namespace std;
 
int main ()
{
   char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};
 
   cout << "菜鸟教程: ";
   cout << site << endl;
 
   return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

菜鸟教程: RUNOOB

C++ 中有大量的函数用来操作以 null 结尾的字符串:

序号

函数 & 目的

1

strcpy(s1, s2); 复制字符串 s2 到字符串 s1。

2

strcat(s1, s2); 连接字符串 s2 到字符串 s1 的末尾。连接字符串也可以用 + 号,例如: string str1 = "kxdang"; string str2 = "google"; string str = str1 + str2;

3

strlen(s1); 返回字符串 s1 的长度。

4

strcmp(s1, s2); 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回值小于 0;如果 s1>s2 则返回值大于 0。

5

strchr(s1, ch); 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。

6

strstr(s1, s2); 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。

下面的实例使用了上述的一些函数:

实例

#include <iostream>
#include <cstring>
 
using namespace std;
 
int main ()
{
   char str1[13] = "kxdang";
   char str2[13] = "google";
   char str3[13];
   int  len ;
 
   // 复制 str1 到 str3
   strcpy( str3, str1);
   cout << "strcpy( str3, str1) : " << str3 << endl;
 
   // 连接 str1 和 str2
   strcat( str1, str2);
   cout << "strcat( str1, str2): " << str1 << endl;
 
   // 连接后,str1 的总长度
   len = strlen(str1);
   cout << "strlen(str1) : " << len << endl;
 
   return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

strcpy( str3, str1) : kxdang
strcat( str1, str2): kxdanggoogle
strlen(str1) : 12

C++ 中的 String 类

C++ 标准库提供了 string 类类型,支持上述所有的操作,另外还增加了其他更多的功能。我们将学习 C++ 标准库中的这个类,现在让我们先来看看下面这个实例:

现在您可能还无法透彻地理解这个实例,因为到目前为止我们还没有讨论类和对象。所以现在您可以只是粗略地看下这个实例,等理解了面向对象的概念之后再回头来理解这个实例。

实例

#include <iostream>
#include <string>
 
using namespace std;
 
int main ()
{
   string str1 = "kxdang";
   string str2 = "google";
   string str3;
   int  len ;
 
   // 复制 str1 到 str3
   str3 = str1;
   cout << "str3 : " << str3 << endl;
 
   // 连接 str1 和 str2
   str3 = str1 + str2;
   cout << "str1 + str2 : " << str3 << endl;
 
   // 连接后,str3 的总长度
   len = str3.size();
   cout << "str3.size() :  " << len << endl;
 
   return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

str3 : kxdang
str1 + str2 : kxdanggoogle
str3.size() :  12
本文转载于网络 如有侵权请联系删除

相关文章

  • elf格式分析

    大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。近期研究了一下elf文件格式,发现好多资料写的都比較繁琐,可能会严重打击学习者的热情,我把自己研究的结果和大家分享,希望我的描写叙述可以简洁一些。一、基础知识elf是一种文件格式,用于存储Linux程序.它内部都有一些什么信息呢?大概包含编制好的计算机指令,数据,计算机在须要的时候把这个文件读取到内存中,cpu就能够从内存中一条一条的读取指令来运行了。所以说想明确elf格式,我们应该了解一下计算机运行程序须要那些信息。所以这一节,我们补充一些计算机系统的基础知识。进程和虚拟内存:Linux系统给每一个进程分配了4GB的空间,当中0xC0000000到0xFFFFFFFF这个地址段是留给系统使用的,主要用于系统(linux内核)和进程通信和交换数据,用户能够使用3GB的空间从(0x00000000-0xBFFFFFFF).事实上计算机的内存是没有那么大的,比方我们实际使用的计算机仅仅有2G,曾经更小,仅仅有几百M,并且一台计算机上不仅仅执行一个进程,一个占用4G,假设有10个进程,那就得着用40G了,哪有那么打的内存呢?事实上

  • HTTP 2.0 为什么这么设计

    HTTP1.0是1996年发布的,奠定了web的基础。时隔三年,1999年又发布了HTTP1.1,对功能上做了扩充。之后又时隔十六年,2015年发布了HTTP2.0。同学们肯定会觉得,隔了这么长时间,而且还从版本号还从1到了2,那肯定有很多的新功能。其实不是的,HTTP2.0没有没有功能上的新增,只是优化了性能。为什么要这么大的版本升级来优化性能,HTTP1.1的性能很差么?那我们就来看下HTTP1.1有什么问题:HTTP1.1的问题我们知道,HTTP的下层协议是TCP,需要经历三次握手才能建立连接。而HTTP1.0的时候一次请求和响应结束就会断开链接,这样下次请求又要重新三次握手来建立连接。为了减少这种建立TCP链接的消耗,HTTP1.1支持了keep-alive,只要请求或响应头带上Connection:keep-alive,就可以告诉对方先不要断开链接,我之后还要用这个链接发消息。当需要断开的时候,再指定Connection:close的header。这样就可以用同一个TCP链接进行多次HTTP请求响应了:但这样虽然减少了链接的建立,在性能上却有问题,下次请求得等上一个请求返回响

  • 云原生利器 -- SkyWalking

    1SkyWalking简介SkyWalking是一个APM(应用程序性能监视器)系统,专门为微服务,云原生和基于容器(Docker,Kubernetes,Mesos)的体系结构而设计。 SkyWalking的功能包括对CloudNative体系结构中的分布式系统的监视,跟踪,诊断功能。核心功能如下:服务、服务实例、端点指标分析根本原因分析,在运行时分析代码服务拓扑图分析服务、服务实例和端点依赖关系分析检测慢速服务和端点性能优化分布式跟踪和上下文传播数据库访问指标,检测慢速数据库访问语句(包括SQL语句)报警浏览器性能监控 详情可访问Github地址:https://github.com/apache/skywalking,本文将介绍如何在k8s环境中部署使用SkyWalking8.3.0版本,实操,不要错过哦!2K8s部署monitoring-nm.yaml#创建namespace-monitoring apiVersion:v1 kind:Namespace metadata: name:monitoring复制oap-serviceaccount.yaml#创建SkyWalking

  • 【LFS 系列】从零开始 DIY Linux 系统:(六)构建 LFS 系统 - 进入 Chroot 环境

    现在可以切换到chroot环境开始构建和安装最终的LFS系统了。以root用户运行下面的命令进入这个“空间”,目前,里面只入住了之前准备的临时工具:chroot"$LFS"/tools/bin/env-i\ HOME=/root\ TERM="$TERM"\ PS1='\u:\w\$'\ PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin\ /tools/bin/bash--login+h复制 从这里以后,就不再需要LFS变量了,因为后面所有工作都将被限定在LFS文件系统里。这是因为我们已经告诉Bash终端$LFS就是当前的根目录(/)。请注意/tools/bin放在了PATH变量的最后。意思是在每个软件的最后版本编译安装好后就不再使用临时工具了。这还需要让shell不要“记住”每个可执行文件的位置—这样的话,还要给bash加上+h选项来关闭其哈希功能。????注意:bash的提示符是Ihavenoname!。这是正常的,因为这个时候/etc/passwd文件还没有被创建。本次分享到此结

  • 【第3版emWin教程】第24章 emWin6.x的JPEG图片显示(软件解码)

    教程不断更新中:http://www.armbbs.cn/forum.php?mod=viewthread&tid=98429第24章emWin6.x的JPEG图片显示(软件解码)本期主要讲emWin支持的JPEG图片显示,官方支持的主要有两种显示方法,一种方法是直接从外部存储器读取数据并显示,这种方法的好处就是不需要大的RAM,每次读取一些数据显示一次,缺点就是显示速度比较慢。另一种是从外部存储器读取整个图片到RAM(比如内部SRAM,外部SRAM或者外部SDRAM),然后再显示图片,这种方法的显示速度要稍快些。但是由于JPEG解码比较耗时间,仅加载到RAM还是不行的,需要用户将JPEG图片解码到内存设备中,然后再调用内存设备的API函数来显示,此时的显示速度非常快。学习本章节前,请务必学习第20章存储设备之基本函数。24.1初学者重要提示24.2JPEG图片基础知识24.3JPEG图片的API函数及其显示方法24.4实验例程说明(RTOS)24.5实验例程说明(裸机)24.6总结24.1初学者重要提示1、实际项目中强烈建议将JPEG图片加载到emWin动态内存并解码到存储设

  • Kubernetes Pod基础

    一:Pod-资源对象概述Pod是k8s系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在k8s上运行容器化应用的资源对象,其他的资源对象都是用来支撑或者扩展Pod对象功能的,比如控制器对象是用来管控Pod对象的,Service或者Ingress资源对象是用来暴露Pod引用对象的,PersistentVolume资源对象是用来为Pod提供存储等等,k8s不会直接处理容器,而是Pod,Pod是由一个或者多个container组成的。节点,Pod,容器之前的关系二:Pod特性:2.1资源共享一个Pod里的多个容器可以共享存储和网络,可以看作一个逻辑的主机。共享的如namespace,cgroups或者其他的隔离资源。多个容器共享同一个networknamespace,由此在一个Pod里的多个容器共享Pod的IP和端口namespace,所以一个Pod内的多个容器之间可以通过localhost来进行通信,所需要注意的是不同容器要注意不要有端口冲突即可。不同的Pod有不同的IP,不同Pod内的多个容器之前通信,不可以使用IPC(如果没有特殊指定的话)通信,

  • 初识grunt

    很早就听人提过grunt,我的概念里一直认为它是一个类似java界maven的东西,帮助开发人员从频繁地编译、配置管理等工作中解放出来。今天比较有空,就尝试使用一下这个东西,看看它是不是真的那么好用。首先安装nodejs#安装Homebrew ruby-e"$(curl-fsSLhttps://raw.github.com/Homebrew/homebrew/go/install)" #安装nodejs brewinstallnode #安装grunt-cli npminstall-ggrunt-cli复制切换到工程目录,安装3个nodejs模块npminstallgrunt--save-devnpminstallgrunt-contrib-uglify--save-devnpminstallgrunt-contrib-htmlmin--save-dev在工程目录中新建一个Gruntfile.js文件module.exports=function(grunt){ //Projectconfiguration. grunt.initConfig({ uglify:{

  • RealVNC Server Ubuntu 20.04 无显示器连接 虚拟显示器

    大家好,又见面了,我是你们的朋友全栈君。以前尝试过完全不接显示器,vnc连接设置总是不成功,这次很容易做成功了,记录一下。以前记录的远程桌面使用心得:https://blog.csdn.net/u012911347/article/details/80475254RealVNC远程连接带显示器模式:https://blog.csdn.net/u012911347/article/details/81209222RealVNC远程连接无显示器模式,但是要用非原生桌面:https://blog.csdn.net/u012911347/article/details/90267252现在是基于ubuntu20.04,桌面版,使用RealVNCServer,不连接显示器的模式,也就是headless。且没有键盘鼠标,一切正常。因为有xorg检测不到键盘鼠标就不启动服务的说法,所以这次也特定试了下,没有影响。具体配置只要复制粘贴就可以了:sudoaptupdate sudoaptinstallxserver-xorg-video-dummy复制就是安装xserver-xorg-video-dum

  • 如何用matlab画函数图_matlab常用画图函数

    大家好,又见面了,我是你们的朋友全栈君。 matlab画图函数基本使用(适合新手)画图1.散点图(scatter()函数):2.函数图像(plot()函数):1.在同一张图绘制多条曲线2.改变颜色和大小3.限制XY坐标轴范围4.gridon加上网格线5.subplot函数绘制多个子图3.拟合N阶曲线(polyfit()函数和polyval()函数)画图1.散点图(scatter()函数):scatter(X,Y)简单来用给出XY的值通过函数便能在该坐标上画出一个圆圈,例如scatter(1,2)复制 如果将XY替换成长度相同的数组(长度不同自然无法一一对应)便能够画出多组点我们可能根据实际的需要,会调整圆圈大小和颜色,那么就要在scatter()后面添加相应的变量 scatter(X,Y,S,C) S必须为标量或长度与X相同的矢量。 (如果S是标量,则MATLAB绘制所有标记的大小相同。如果S是矢量,则分别对应为X、Y所确定圆的大小) C必须为RGB三元数、与X长度相同的M×1矢量或M×3矩阵。x=linspace(0,3*pi,200); y=cos(x)+rand(1,200);

  • HighChats报表使用C#mvc导出本地图片

    最近工作使用了HighCharts,要用到保存成图片功能,但是是内部使用,不允许连接外网,于是就学习了下highcharts生成本地图片。 highcharts有一个exporting.js来负责导出成图片功能。   1.先在页面引用两个js。我使用的是exporting.src.js,方便查看源码,这里需要修改一点点东西。 要显示中文的话,需要在exporting.src.js最末尾处加上以下设置,或者直接修改初始化的默认值。 Highcharts.setOptions({   lang:{     printChart:"打印图表",     downloadJPEG:"下载JPEG图片",     downloadPDF:"下载PDF文档",     downloadPNG:"下载PNG图片",     downloadSVG:"下载SVG矢量图",     exportButtonTitle:"导出图片"   } });复制   2.打开exporting.src.js,找到defaultOptions.exporting属性里的url,这里发送了一个

  • kenkins安装

    1、获取安装文件:从百度网盘下载:1、jenkins-2.99-1.1.noarch.rpm,2、jdk-8u121-linux-x64.rpm两个文件2、安装jdk[root@node1~]#rpm-ivhjdk-8u121-linux-x64.rpm3、安装jenkins[root@node1~]#yrpm-ivhjenkins-2.99-1.1.noarch.rpm[root@node1~]#systemctlstartjenkins[root@node1~]#systemctlrestartjenkins[root@node1~]#systemctlstatusjenkins #servicejenkinsstart 重启 #servicejenkinsrestart停止 #servicejenkinsstop 4、JenkinsWEB配置浏览器中访问:http://你服务器的ip:8080,出现如下图所示界面,根据提示在命令行上复制密码,然后下一步192.168.19.132:8080 获取密码:cat/var/lib/jenkins/secrets/initialAdmin

  • linux cat查询关键字(日志查询)

    cd/usr/local/tomcat/logs 复制 grep匹配 --匹配1个关键字 catccs-all.log|grep'转派过户任务' --同时匹配多个关键字 catccs-all.log|grep'转派过户任务'|grep'test11' 复制 grep-v反向匹配 --匹配不包含 catccs-all.log|grep-v'转派过户任务' --匹配不包含 catccs-all.log|grep-v'转派过户任务'|grep-v'test11' 复制 grep-E同时匹配多个关键字–或关系 --匹配包含word1或word2的行 catccs-all.log|grep-E'word1|word2' 复制 不积跬步,无以至千里;不积小流,无以成江海。

  • [Blazor WebAssembly学习笔记]一、项目结构

    项目结构指的是用vs创建的缺省的BlazorWebAssembly项目结构。 get到以下知识点: MainLayout.razor.css:应用主布局的样式表。 可折叠在razor文件下面 当前组件专属 经测试.cs文件也能折叠 Program.cs:应用入口点,用于设置WebAssembly主机: App组件是应用的根组件。对于根组件集合(builder.RootComponents.Add("#app")),使用app的id(wwwroot/index.html中的 <divid="app">Loading...</div> )将App组件指定为divDOM元素。 添加并配置了服务(例如,builder.Services.AddSingleton<IMyDependency,MyDependency>())。 机器翻译比较醉人。 “builder.RootComponents.Add("#app");”这行代码的意思是用App组件替换index.html文件中id为“app"的div。

  • eclipse中ctrl+h默认打开是JavaSearch,怎么设置成默认打开是FileSearch

    window->preferences->General->keys。 找到FileSearch(有搜索框的,可以搜索),然后在下方Binding按下ctrl+h。

  • centos 6.4 /var/log/secure 不记录日志的問題

    先确保日志服务开启;不妨重启下日志服务;由于目前RHEL6/centos6已经使用rsyslog替换了syslog.,所以不要在找/etc/syslog.conf了;重启命令:/etc/init.d/rsyslogrestart尝试ssh重新登录進行测试,secure有信息了問題解决

  • TP_字母函数

    1.A() A函数用于实例化控制器 格式:[资源://][模块/]控制器A($name,$layer='',$level='') @paramstring$name资源地址 @paramstring$layer控制层名称 @paraminteger$level控制器层次 @returnController|false 2.B() 执行某个行为B($name,$tag='',&$params=NULL) @paramstring$name行为名称 @paramstring$tag标签名称(行为类无需传入) @paramMixed$params传入的参数@returnvoid 这是随着行为应运而生的新生函数,可以执行某个行为,例如B('app_begin'); 就是在项目开始之前,执行这个行为定义的所有函数,支持2个参数,第二个参数支持需要接受一个数组 例如B('app_begin',array("name"=>"tdweb","time"=>time()));这样。   3.C() 读取及设置配置参数C($name=null,$value=null,$def

  • CentOS8下安装Geforce GTX 650驱动

    第一步:查看显卡类型 [root@localhost~]#lshw-numeric-Cdisplay 显示显卡类型:product:GK107[GeForceGTX650][10DE:FC6] 显示驱动是nouveau:configuration:driver=nouveaulatency=0 Nouveau是第三方为NVIDIA显卡开发的一个开源3D驱动,没有得到NVIDIA的认可与支持。       第二步:到nvidia官网下载对应驱动 https://www.nvidia.com/Download/index.aspx# NVIDIA-Linux-x86_64-440.44.run   第三步:安装驱动所依赖的软件包 #yumgroupinstall"DevelopmentTools"#yuminstallkernel-develepel-release#yuminstalldkms   第四步:禁用nouveau,通过修改配置 /etc/default/grub [root@localhost~]#vi/

  • QRowTable表格控件(五)-重写表头排序、支持第三次单击恢复默认排序

    目录一、原生表格二、效果展示三、实现方式1、排序列定制2、排序交互修改四、相关文章 原文链接:QRowTable表格控件(五)-重写表头排序、支持第三次单击恢复默认排序 一、原生表格 开发客户端程序的方式越来越多了,现在很流行的libcef、electron等等都可以作为快速开发客户端软件的方案,但是如果需要一个好的用户体验,还是离不开原生化的开发,虽然慢,但是性能好啊。 说到原生化开发,那对应的UI库相对较多,流行的就有Qt、soui、duilib、还有老掉牙的MFC和其他一些第三方公司开源维护的directUI库等等。网上找到一篇整理的文章,有兴趣的同学可以参考C++界面库。 目前C++客户端使用最广泛的就是UI框架就是Qt,它不仅包含了GUI控件,更多的其实是一种解决方案,使用过Qt的同学都比较清楚,Qt的安装动态库有几十个之多,可是如果你只想使用Qt的GUi模块的话,就只需要包含3个动态库即可,他们分别是核心模块QtCore、Gui模块QtGui和QtWidget。 当我们将Qt作为我们的开发SDK时,大多数时候原生的控件+qss美化就可以完成我们的需求,然而总有一些特殊情况,

  • [LeetCode] 1744. 你能在你最喜欢的那天吃到你最喜欢的糖果吗?

    都儿童节了,为什么要折磨一个几百个月大的孩子? 把题意读懂挺难的。不过读懂后基本也就知道怎么做了。恶心的是int类型可能会越界,要用long类型(很难想到)。这题不好 [1744.你能在你最喜欢的那天吃到你最喜欢的糖果吗?](https://leetcode-cn.com/problems/can-you-eat-your-favorite-candy-on-your-favorite-day/) ``` classSolution{ publicboolean[]canEat(int[]candiesCount,int[][]queries){ intn=candiesCount.length; long[]sum=newlong[n]; sum[0]=candiesCount[0]; for(inti=1;i

  • P1064 [NOIP2006 提高组] 金明的预算方案(DP)

    可以将分组的背包看成若干个01背包来做。 #include<cstdio> #include<iostream> usingnamespacestd; intread(){ intnum=0,f=1; charc=getchar(); while(c<'0'||c>'9'){ if(c=='-')f=-1; c=getchar(); } while(c>='0'&&c<='9'){ num=num*10+c-'0'; c=getchar(); } returnnum*f; } intn,m; intv[65][3],p[65][3]; intcnt; intf[32005]; intmain(){ n=read();m=read(); for(inti=1;i<=m;i++){ intvv=read(),pp=read(),qq=read(); if(qq==0){ v[i][0]=vv; p[i][0]=pp*vv; } elseif(!v[qq][1]

  • javascript学习—理解addLoadEvent函数

    onload事件是HTMLDOMEvent对象的一个属性,又叫事件句柄(EventHandlers),它会在页面或图像加载完成后(注意是加载完成后)立即发生。 window.onload=func的作用就是在页面加载完成后将func函数绑定到onload事件上并执行。如果页面加载完成之后,只需要执行一个函数func,那么只用window.onload=func也就可以了,但是如果需要执行两个甚至多个函数呢? 直接调用两次onload不就行了: window.onload=firstfunction;window.onload=secondfunction; 这么做的话,只有secondfunction会被绑定,因为前面的值被后面的值覆盖了。那么该怎么办? 将两个函数合并到一个函数当中不就行了,匿名函数发挥作用的时候到了: window.onload=function(){ fristfunction; secondfunction; }复制 不过,它也只能绑定两个函数。还好,大神们早已解决了这个问题。西蒙·威利森(SimonWillison)——jQuery框架的开发者之一编写了下

相关推荐

推荐阅读