C/C++字符串使用整理

前言

字符串类型,即string类型,因为使用方便,不必担心内存问题,越界问题等等,还有在不太确定即将存入的字符串长度的时候使用是非常好的。本片中,将会对string类型的字符串和char类型的字符串对比使用讲解,作为随笔笔记,记录常用的用法,同时也会随着见识的增长随时更新

 
举栗子

string 类型字符串在使用的时候需要加上头文件#include<string>,而char类型的字符串数组在使用的时候往往要加上头文件#include<cstring>才能够使用。下面对比介绍string类型和char类型字符串的用法

(接下来的例子给变量命名我都用的是str1,str2…)


声明:

string str1,str2     char str1[MAXSIZE],str2[MAXSIZE]  //假定要定义的char类型字符串数组的大小为MAXSIZE

 
比较:>,==,<,>=,<=等

       String类型:str1==str2;str1>=str2;str1<=str2 就不一一列举了,可以看出,string类型字符串比较是非常方便的,直接就像int类型那样直接比就可以了(当然比法是不一样的)

       Char类型:strcmp(str1,str2); 有返回值的,str1<str2 返回负数,str1==str2返回为0,str1>str2返回正数。某真心感觉很麻烦,每次比较都要用函数,当然也可以进行运算符重载直接像string类型那样比较,如果不嫌麻烦的话。

 
复制拷贝:

将str2中内容复制到str1中

string类型:str1=str2        char类型:strcpy(str1,str2);

string类型变量在定义的时候还可以拷贝构造函数,如string str1(str2);

 
连接:

将str2中内容连接到str1后头

String 类型:str1+=str2    char类型:strcat(str1,str2);

 
统计字符个数(字符串长度):

统计字符串中字符的个数:

String类型:str1.length();  str1.size();返回的值都是str1的长度

Char 类型:strlen(str1); 返回的值是str1的长度

 
清空字符串变量中所有数据:

String类型:str1..~string();

              或者:str1=””;

 
将char类型字符串转换成string类型:

char str1=”***”;

string str2(str1);

 
将string类型转换成char类型:

strcpy(str2,str1.c_str());

前边的str2是char类型的字符串,后边str1是string类型的。注意转换千万别越界

string中的某一个字符是可以直接保存到char类型字符中的,例如

string str=”123”

如ch=str[1];

那么输出ch打印出来的是2

字符串中的某一字符转换成int类型数字:

int num=str[i]-‘0’;

 
字符串类型与整数类型互相转换:

字符串转换成整数:

用atoi()函数,C语言中头文件是#include<stdlib.h>(C++中是#include<cstdlib>)

用法:atoi只能转char *类型的,如果是string类型的,需先转成char类型

int num=atoi(str);

 
整数转换成字符串:

Itoa()函数,将整数转换成char类型

itoa(num,str, radix);

num是int类型数字,str是最终转换成char的结果,radix是用多少进制保存,如2、8、10、16进制等

 
字符串中查找子串:
find()函数:

字符串详细内容见大神博客:http://blog.csdn.net/laobai1015/article/details/62426137

基本用法

int key=find(str1,str2);

其中str1、str2都是string类型,函数的意思是在str1中查找str2第一次出现的位置并返回这个值,如果不存在则返回-1

 
strstr()函数:

char *str3=strstr(str1,str2);

str1,str2均为char*类型,函数的意思是在str1中查找str2,返回第一次出现str2的地址,如果没有找到则返回空

例如str1=”My name is”;    str2=”name”;

那么返回的str3为“name is”;

string类型中,字符串字串的截取:


substr()函数,用于string类型

string str;

str.substr(startnum, len);

其中 startnum 是起始字符的序号,len是从起始字符开始截取的字符串长度

那么,若要截取str中序号m到n间(其中不包括n)的子字符串则为

str.substr(m, n-m);

 
strtok()函数,用于char类型

char *str=strtok(str1,str2);

将字符串str1沿着str2切割,返回的是char*
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.基础函数
输入输出:cin,cout,getchar,gets,putchar,puts,printf,scanf
格式化:sprintf,sprintf_s,wsprintf,wsprintf_s,swprintf,swprintf_s  (请仔细比较这几组函数的区别)
格式化值:

    %% -返回百分号
    %b –返回二进制数
    %c –返回与ASCII值相对应的字符
    %d –带有正负号的十进制数
    %e –科学计数符号(如:1.2e+2)
    %u –不带正负号的十进制数.%ul 不带符号的长整型
    %f – 浮点数据(本地设置)
    %F –浮点数据(非本地设置)
    %o –八进制数
    %s –字符串
    %x –十六进制数(小写字母) 例如:sprintf(s, "%#010x", 128); //产生"0x00000080"
    %X –十六进制数(大写字母)

char*字符串处理:strlen,strcpy,strcat,strcmp
2.进阶函数
char*字符串处理:

    char * strchar(const char * s, int c) ;返回指向字符串s中字符c首次出现的指针,没有返回NULL
    char * strrchar(const char * s, int c) ;返回指向字符串s中字符c最后一次出现的指针,没有返回NULL
    char * strstr(const char * s1, const char * s2) ;返回指向字符串s1中首次出现s2位置的指针,无返回NULL
    size_t strspn(const char * s1, const char * s2) ;返回s1中只包含s2中字符的起始段的长度
    size_t strcspn(const char * s1, const char * s2) ;返回s1中不包含s2中字符的起始段的长度
    char * strpbrk(const char * s1, const char * s2) ;返回指向s1中首次出现s2中字符位置的指针,没有返回NULL
    char * strtok(char * s1, const char * s2) 将s1用s2中包含的字符分开记号拆散为字符串。(注意:strtok会修改输入的字符串,故请拷贝后再调用。)
    char *strsep(char **stringp, const char *delim) 同上,分隔字符串,用法类似

string字符串处理:

    长度:str.length()
    尺寸:str.size()
    比较:str1.compare(str2)
    连接:str1+=str2
    连接:str1.append(str2)
    提取:str2=str2.substr(pos1)
    查找:pos=str1.find(str2)
    插入:str1.insert(pos1,str2);
    替换:str1.replace(pos1,str2);
    删除:str1.erase(pos,len)
    清除:str.clear()

字符串转数字:

    atoi(将字符串转换成整型数)
    atof(将字符串转换成浮点型数)
    atol(将字符串转换成长整型数)
    strtod(将字符串转换成双精度浮点数)
    strtol(将字符串转换成长整型数)
    strtoul(将字符串转换成无符号长整型数)

字符判断:

    isalnum:Check if character is alphanumeric (function)
    isalpha :Check if character is alphabetic (function)
    iscntrl :Check if character is a control character (function)
    isdigit :Check if character is decimal digit (function)
    isgraph :Check if character has graphical representation (function )
    islower :Check if character is lowercase letter (function)
    isprint :Check if character is printable (function)
    ispunct :Check if character is a punctuation character (function)
    isspace :Check if character is a white-space (function )--空白字符:新行符\n, 空格,回车''\r",水平制表符"\t", 垂直制表符"\v"
    isupper :Check if character is uppercase letter (function)
    isxdigit :Check if character is hexadecimal digit (function)
    tolower:Convert uppercase letter to lowercase (function)
    toupper:Convert lowercase letter to uppercase (function)

内存操作:

    void * memcpy(void * s1, const void * s2, size_t n) ; 将s2中连续n个字节的数据拷贝到s1中 ,注意s1和s2内存区域不能重叠
    void * memmve(void * s1, const void * s2, size_t n) ; 将s2中连续n个字节的数据拷贝到s1中 ,但s1和s2内存区域可以重叠
    int memcmp(const void * s1, const void * s2, size_t n) ; 比较内存区域s1和s2的前n个字节,<、=、>分别返回负值、0、正值。
    void * memchr(const void * s, int c, size_t n) ; 返回指向s1对象的前n个字节查找出现c的位置的指针,没有返回NULL
    void * memset(void * s, int c, size_t n) ; 将c拷贝到s1中的前n个字节中,常用于字符串初始化,初始化也可以写char *str={0}

格式转换:

    char*到string:可以直接赋值
    string转char*:str.c_str()

    char*和wchar_t*互转:比较复杂,综合运用多种函数。

 

posted @ 2019-04-27 15:52  AloneGhost  阅读(188)  评论(0编辑  收藏  举报