string&&char 小技巧
关于string
=,assign() //赋以新值
swap() //交换两个字符串的内容
+=,append(),push_back() //在尾部添加字符
insert() //插入字符
erase() //删除字符
clear() //删除全部字符
replace() //替换字符
+ //串联字符串
==,!=,<,<=,>,>=,compare() //比较字符串
size(),length() //返回字符数量
max_size() //返回字符的可能最大个数
empty() //判断字符串是否为空
reserve() //保留一定量内存以容纳一定数量的字符
[ ], at() //存取单一字符
copy() //将某值赋值为一个C_string
c_str() //将内容以C_string返回
data() //将内容以字符数组形式返回
读入的一些区别:
string s1; 默认构造函数,s1为空串
string s2(s1); 将s2初始化为s1的一个副本
string s3("valuee"); 将s3初始化一个字符串面值副本
string s4(n,'c'); 将s4 初始化为字符'c'的n个副本
cin>>s5; 读取有效字符到遇到空格
getline(cin,s6); 读取字符到遇到换行,空格可读入,知道‘\n’结束,
getline(cin,s7,'a'); 一个直到‘a’结束,其中任何字符包括'\n'都能够读入。
关于char
1、字符数组的定义与初始化
字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。
char str[10]={ 'I',' ','a','m',' ',‘h','a','p','p','y'};
即把10个字符分别赋给str[0]到str[9]10个元素
如果花括号中提供的字符个数大于数组长度,则按语法错误处理;若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 '\0' )。
2、字符数组与字符串
在c语言中,将字符串作为字符数组来处理。(c++中不是)
在实际应用中人们关心的是有效字符串的长度而不是字符数组的长度,例如,定义一个字符数组长度为100,而实际有效字符只有40个,为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”,以字符'\0'代表。如果有一个字符串,其中第10个字符为'\0',则此字符串的有效字符为9个。也就是说,在遇到第一个字符'\0'时,表示字符串结束,由它前面的字符组成字符串。
系统对字符串常量也自动加一个'\0'作为结束符。例如"C Program”共有9个字符,但在内存中占10个字节,最后一个字节'\0'是系统自动加上的。(通过sizeof()函数可验证)
有了结束标志'\0'后,字符数组的长度就显得不那么重要了,在程序中往往依靠检测'\0'的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度。当然,在定义字符数组时应估计实际字符串长度,保证数组长度始终大于字符串实际长度。(在实际字符串定义中,常常并不指定数组长度,如char str[ ])
说明:'\n'代表ASCII码为0的字符,从ASCII码表中可以查到ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不干。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。
对C语言处理字符串的方法由以上的了解后,再对字符数组初始化的方法补充一种方法——即可以用字符串常量来初始化字符数组:
char str[ ]={"I am happy"}; 可以省略花括号,如下所示
char str[ ]="I am happy";
注意:上述这种字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值,字符数组的赋值只能对其元素一一赋值,下面的赋值方法是错误的
char str[ ];
str="I am happy";
不是用单个字符作为初值,而是用一个字符串(注意:字符串的两端是用双引号“”而不是单引号‘'括起来的)作为初值。显然,这种方法更直观方便。(注意:数组str的长度不是10,而是11,这点请务必记住,因为字符串常量"I am happy"的最后由系统自动加上一个'\0')
因此,上面的初始化与下面的初始化等价
char str[ ]={'I',' ','a','m',' ','h','a','p','p','y','\0'};
而不与下面的等价
char str[ ]={'I',' ','a','m',' ','h','a','p','p','y'};
前者的长度是11,后者的长度是10.
说明:字符数组并不要求它的最后一个字符为'\0',甚至可以不包含'\0',向下面这样写是完全合法的。
char str[5]={'C','h','i','n','a'};
++++++++
可见,用两种不同方法初始化字符数组后得到的数组长度是不同的。
#include <cstdio>
int main()
{
char c1[]={'I',' ','a','m',' ','h','a','p','p','y'};
char c2[]="I am happy";
int i1=sizeof(c1);
int i2=sizeof(c2);
printf("%d\n",i1);
printf("%d\n",i2);
return ; }
结果:10 11
3、字符串的表示形式
在C语言中,可以用两种方法表示和存放字符串:
(1)用字符数组存放一个字符串
char str[ ]="I love China";
(2)用字符指针指向一个字符串
char* str="I love China";
对于第二种表示方法,有人认为str是一个字符串变量,以为定义时把字符串常量"I love China"直接赋给该字符串变量,这是不对的。
C语言对字符串常量是按字符数组处理的,在内存中开辟了一个字符数组用来存放字符串常量,程序在定义字符串指针变量str时只是把字符串首地址(即存放字符串的字符数组的首地址)赋给str。
两种表示方式的字符串输出都用
printf("%s\n",str);
%s表示输出一个字符串,给出字符指针变量名str(对于第一种表示方法,字符数组名即是字符数组的首地址,与第二种中的指针意义是一致的),则系统先输出它所指向的一个字符数据,然后自动使str自动加1,使之指向下一个字符...,如此,直到遇到字符串结束标识符 " \0 "。
4、对使用字符指针变量和字符数组两种方法表示字符串的讨论
虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈。
4.1、字符数组由若干个元素组成,每个元素放一个字符;而字符指针变量中存放的是地址(字符串/字符数组的首地址),绝不是将字符串放到字符指针变量中(是字符串首地址)
4.2、赋值方式:
对字符数组只能对各个元素赋值,不能用以下方法对字符数组赋值
char str[14];
str="I love China"; (但在字符数组初始化时可以,即char str[14]="I love China";)
而对字符指针变量,采用下面方法赋值:
char* a;
a="I love China";
或者是 char* a="I love China"; 都可以
4.3、对字符指针变量赋初值(初始化):
char* a="I love China";
等价于:
char* a;
a="I love China";
而对于字符数组的初始化
char str[14]="I love China";
不能等价于:
char str[14];
str="I love China"; (这种不是初始化,而是赋值,而对数组这样赋值是不对的)
4.4、如果定义了一个字符数组,那么它有确定的内存地址;而定义一个字符指针变量时,它并未指向某个确定的字符数据,并且可以多次赋值。
5、字符串处理函数
5.1
char *strcat(char *str1,const char *2 );
char *strcat(char *strDestination,const char *strSource );
功能:函数将字符串str2 连接到str1的末端,并返回指针str1
注:连接前两个字符串的后面都有一个' \0 ',连接时将字符串1后面的 ' \0 ‘去掉,只在新串最后保留一个 ' \0 ‘
5.2
char *strcpy(char *str1,const char *2 );
char *strcpy(char *strDestination,const char *strSource );
功能:复制字符串strSource中的字符到字符串strDestination,包括空值结束符。返回值为指针strDestination。
注:1、“字符数组1”必须写成数组名形式,“字符串2"可以是字符数组名,也可以是一个字符串常量
2、复制时连同字符串后面的 ' \0 ' 一起复制到数组1中
3、不能用赋值语句直接将一个字符串常量或者字符数组直接赋给一个字符数组(同普通变量数组是一样的),而只能用strcpy函数处理。
4、可以用strcpy函数将字符串2中的前若干个字符复制到字符数组1中去。
参考:
大神养成中.....
string&&char 小技巧的更多相关文章
- ios开发中的小技巧
在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIViewal ...
- Shellcode编程小技巧
工作需要,需要注入其他程序监控一些东西,检测到的数据通过WM_COPY 消息发送给显示窗体.(大体是这样的还没定稿) ##1 选择一个框架 ## tombkeeper/Shellcode_Templa ...
- HDU 5895 Mathematician QSC(矩阵乘法+循环节降幂+除法取模小技巧+快速幂)
传送门:HDU 5895 Mathematician QSC 这是一篇很好的题解,我想讲的他基本都讲了http://blog.csdn.net/queuelovestack/article/detai ...
- iOS小技巧总结,绝对有你想要的
原文链接 在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIV ...
- SmartForms 小技巧
1.添加空行,保证每一页有固定的打印的表格行数 上图,每页最多打印13行,数据只有11行,自动添加两个空行补齐 代码如下“ "定义变量: data: l_blank type i. &quo ...
- gdb调试运行时的程序小技巧
使用gdb调试运行时的程序小技巧 标签: 未分类 gdb pstack | 发表时间:2012-10-15 04:32 | 作者:士豪 分享到: 出处:http://rdc.taobao.com/bl ...
- Java小技巧输出26个英文字母
相信有的童鞋写到过与字母有关的小东西,是否有写过全部的字母呢?26个这么多字母,一个个打会疯掉.所有咱们可以用一个小技巧使用for循环帮我们把26个字母自动搞出来,大家来瞅一眼把! 使用Java遍历2 ...
- 10个小技巧助您写出高性能的ASP.NET Core代码
今天这篇文章我们来聊一聊如何提升并优化ASP.NET Core应用程序的性能,本文的大部分内容来自翻译,当然中间穿插着自己的理解,希望对大家有所帮助!话不多说开始今天的主题吧! 我们都知道性能是公共网 ...
- LoadRunner小技巧集锦
preftest 性能测试工作室,专注于性能测试技术研究(www.AutomationQA.com) LoadRunner小技巧集锦 1.录制脚本中包含中文,出现乱码怎么办? 把录制选项中的Suppo ...
随机推荐
- Appium常见问题(持续更新)
1.Original error: Could not parse activity from dumpsys 命令行:adb shell dumpsys cpuinfo 报:service du ...
- RandomAccessFile使用小结
本文是基于Linux环境运行,读者阅读前需要具备一定Linux知识 RandomAccessFile是Java输入/输出流体系中功能最丰富的文件内容访问类,既可以读取文件内容,也可以向文件输出数据.与 ...
- springMVC: java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config
springMVC开发web的时候,报错:java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config 原因:未引入jstl ...
- 《CoffeeScript应用开发》学习:第五章 CoffeeScript中的类
在CoffeeScript中定义类 在CoffeeScript中,使用class定义类,使用关键字new实例化对象. 给类绑定方法 class Airplane takeOff: -> cons ...
- python使用代理ip发送http请求
一.需求背景 网站刷票时,经常会遇到限制一个ip只能投票一次的限制,为此需要使用代理ip 二.脚本如下: 1.Proxy_http.py使用代理ip发送httpr的get和post请求 #coding ...
- echarts引入及应用
1.在官网上下载echarts并引入项目中 <script src="js/echarts.js"></script> 2.给一个DOM作为图表展示的容器, ...
- centos服务器全新安装php,apache环境
留个备份,有空研究一下. 1 yum install php56w-devel.x86_64 yum install httpd-devel.x86_64 vim /etc/php.ini vim / ...
- Python 多线程 Condition 的使用
Condition Condition(条件变量)通常与一个锁关联.需要在多个Contidion中共享一个锁时,可以传递一个Lock/RLock实例给构造方法,否则它将自己生成一个RLock实例. 可 ...
- webstorm 2016 激活(转)
2016.2.2 版本的破解方式: 安装以后,打开软件会弹出一个对话框:选择"license server" 输入:http://114.215.133.70:41017 2016 ...
- java:关于文件下载
开发中遇到的问题 一. 场景描述:用户先指定下载路径,服务器将资源文件下载到指定的路径. 首先:该系统采用的是B/S架构,即浏览器.服务器(.数据库). 单纯通过B/S架构,就想要在服务器中去操 ...