C语言中没有string类型,字符串都是通过char形式存储的。
typedef const char * string;
定义字符串的几种形式:字符串常量,char数组,char指针
1、字符串常量 printf("%s","hello")
2、char数组 char str[40] ="hello,world";
char str={'"','h','e','l','l','o','"','\0'}; =“hello”(必须加“\0”,若没有他,认为字符数组,不是字符串)
3、char指针 char *m="hello,world";
数组形式和指针形式的区别:
数组形式:
编译器会把数组名m看作是数组首元素的地址&m[0]的同义词,m是个地址常量。可以用m+1来标识数组里的下一个元素,但不能使用++m,增量运算符只能在变量前使用, 而不能在常量前使用。
m[40]在计算机内存中被分配一个有40个元素的数组(其中每个元素对应一个字符,还有一个附加的元素对应结束的空字符'\0')。每个元素都被初始化为相应的字符
指针形式:
指针形式(*m)也会在静态存储区为字符串预留空间。此外,一旦程序开始执行,还要为指针变量m另外预留一个存储位置,以在该指针变量中能够存储字符串的地址。
m指向字符串的第一个字符,可用++m指向第二个字符。 指针m是个变量。
1、strcmp
功能:比较两个字符串,两个字符串从左向右逐个字符相比(按ASCII值比较),直到出现不同的字符或遇到‘\0’为止
格式:extern int strcmp(const char *s1,const char *s2);
结果:
当s1<s2时,返回一个负数
当s1=s2时,返回值为0
当s1>s2时,返回正数
2、strcat
功能:把src所指字符串添加到dest结尾处,覆盖dest结尾处的‘\0’,返回指向dest的指针
格式:extern char *strcat(char *dest,char *src);
3、strcpy
功能:把从src地址开始且含有NULL结束符的字符串复制到dest开始的地址空间,返回指向dest的指针
格式:extern char *strcpy(char *dest,char *src);
注意: 这个函数的第一个参数必须分配内存,而且内存大小必须能够存的下Src。
4、strncat
功能:把src所指的字符串的前n个字符添加到dest所指的字符串结尾处,覆盖‘\0’,返回指向dest的指针
格式:extern char *strncat(char *dest,const *src,size_t n);
5、strncpy
功能:把从src地址开始的前n个字符复制到dest开始的地址空间,返回指向dest的指针,会产生不以NUL结尾的字符串,注意
格式:extern char *strcpy(char *dest,char *src,size_t n);
也可以把字符数组转换为字符串
5、strncmp
功能:比较两个字符串
格式:int strncmp ( const char * str1, const char * str2, size_t n );
6、strcmp
功能:比较两个字符串,如果相等则返回零,str1<str2,则返回负数,str1>str2返回正数
格式:extern int strcmp(const char *s1,const char *s2);
7、strcasecmp
功能:忽略大小写比较字符串
格式: int strcasecmp (const char *s1, const char *s2);
8、bcmp
功能:比较字符串S1和S2前n个字节是否相等
格式:extern int bcmp(const void *s1, const void *s2, int n);
7、strtol(nptr不能等于NULL)
功能:将字符串转换为长整型数
函数定义: long int strtol(const char *nptr,char **endptr,int base);
8、strtoul(nptr不能等于NULL)
功能:将字符串转换成无符号长整型数
函数定义: unsigned long strtoul(const char *nptr,char **endptr,int base);
说明:将参数nptr根据参数base转换成无符号的长整型数。base为选择哪种进制,范围从2至36.直到遇上非数字或字符串结束时结束转换。将不合条件而终止的nptr字符指针有endptr返回。
9、strtod
功能:将字符串转换为浮点数
函数定义: double strtod(const char *nptr,char **endptr);
nptr字符串可包含正负号,小数点或E(e)来表示指数部分,如123.456或123e-2.
9、atoi
功能:将字符串转换成整数型的一个函数。
函数定义: int atoi(const char *nptr);
nptr课包括正负号。转换后没小数,因为是int类型
10、atol
功能:将字符串转换为长整型数
函数定义: long atol(const char *nptr);
11、atof
功能:将字符串转换为浮点型
12、itoa
功能:将任意类型的数字转换成字符串
函数定义:char*itoa(int value,char*string,int radix);
int value 被转换的整数,char *string 转换后储存的字符数组,int radix 转换进制数
13、sprintf(filename,“./tmp_file/%s”,uuid_buf)
filename 就保存为当前目录下tmp_file的uuid_buf
查找函数
14、strchr
功能:查找字符串str中首次出现字符val的位置,返回首次出现val的位置指针,失败返回NULL
格式:char *strchr(const char* _Str,char val)
15、strrchr
功能:在字符串里查找最后出现字符val的位置
格式:char *strrchr(const char *str, char val);
这样返回当前位置,就能对val位置以后的字符串进行操作。
16、strstr
功能:在字符串str1中定位字符串str2首次出现的位置,返回指向首次匹配时的第一个元素指针,如果没有返回NULL
格式:const char * strstr ( const char * str1, cosnt char *str2);
提取出来的首地址并不是0,和str1的差就是相对于str的位置,相对于内存的位置
17、strrstr
功能:在字符串中查找指定字符串最后一次出现的位置
格式:char *strrstr(char *str1, char *str2);
注意:这个在库里边没有,需要自己写
函数实现:
char *my_strrstr(char *dest,char *src)
{
char *first=NULL;
char *second=NULL;
char *str1=dest;
char *str2=src;
assert(dest);
assert(src);
while((*str1 != '\0'))
{
first=str1; //记录下一次比较的起始位置
while((*str1 != '\0') && (*str2 != '\0') && (*str1 == *str2))
{
str1++;
str2++;
}
if(*str2 == '\0')
second=first; //从第一次查找到子串的位置后继续查找
str1=first+1;
str2=src;
}
if(*str1 == '\0')
return second;
return ;
}
18、strpbrk
功能:在源字符串(S1)中找出最先含有字符串(S2)中任一字符的位置并返回,若找不到则返回空指针。
格式:extern char *strpbrk(const char *s1, const char *s2);
19、strspn
功能:从str字符串的开头计算连续的字符,而这些字符全都是accept所指的字符串中的字符,如果返回值是n,则代表字符串str开头连续有n个字符都是属于字符串accept内的字符
格式:size_t strspn(char const *str,char const *accept)
20、strcspn
功能:与strspn相反,返回str字符串起始部分中不与accept中任何字符匹配的计数。
格式:size_t strcspn(char const * str,char const * accept)
21、strtok
功能:用来将字符串分隔成一个个片段。参数src指向欲分割的字符串,sep是一个字符串,定义了用作分隔符的字符集合.strtok找到str的一个标记后,将其用NUL结尾,然后返回一个指向这个标记的指针。
如果strtok函数的第一个参数不是NULL,函数将找到字符串的第一个标记,strtok同时将保存他在字符串中的位置。如果strtok的第一个参数是NULL,函数就在同一个字符串中从这个被保存的位置开始像前面一样查找下一个标记。如果没有更多标记,则返回NULL
格式:char * strtok(char* str,char const * sep)
例:
main(){
char s[] = "ab-cd : ef;gh :i-jkl;mnop;qrs-tu: vwx-y;z";
char *delim = "-: ";
char *p;
printf("%s ", strtok(s, delim));
while((p = strtok(NULL, delim)))
printf("%s ", p);
printf("\n");
}
或者
for(token=strtok(src,sep);token!=NULL;token=strtok(NULL,sep))
内存操作
对于以上函数,字符串内部不能包含任何NUL字符,因为当他们遇到第一个NUL字符就会停止工作。
所以使用一下函数,这些函数可以处理任意的字节序列,参数是void*型指针,可以处理任何类型的指针
void* memcpy(void * dst,void const *src,size_t length); 把src起始位置复制到dst处
void * memmove(void * dst,void const *src,size_t length);
把src内存位置复制到一个临时位置,这个位置不会跟src或dst重叠,然后再把他从临时位置复制到到目标位置,所以比memecpy慢一些,但是src如果和dst有重叠,就只能用memmove、
例:memmove(x,x+1,100);
void * memcmp(void * const dst,void const *src,size_t length); 对两端内存进行比较n个字符
void * memchr(void * const a,int ch,size_t length); 从a的位置开始查找字符ch第一次出现的位置。返回该位置的指针,总共查找length个字节
void * menset(void * a,int ch,size_t length ); 从a的位置length字节都设置为字符值ch。
字符操作:
字符分类: 如果他的参数符合下列条件就返回真
iscntrl 任何控制字符
isspace 空白字符:空格'',换页'\f',换行'\n',回车'\r',制表符'\t'或者垂直制表符'\v'
isdigit 十进制数字0-9
isxdigit 十六进制数字,包括所有十进制数字,小写字母a-f,大写字符A-F
islower 小写字母 a-z
isupper 大写字母 A-Z
isalpha 字母 a-z A-Z
isalnum 字母或者数字 a-z A-Z 0-9
ispunct 标点符号,任何不属于数字或字母的图形字符(可打印符号)
isgraph 任何图形字符
isprint 任何可打印字符,包括图形字符和空白字符
字符转换:
tolower 返回其参数的小写形式,如果参数不是大写后者不是字母,就不修改直接返回
int tolower(int ch);
toupper 返回其参数的大写形式,同上
int toupper(int ch);