字符串处理
Posted fengzi759
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串处理相关的知识,希望对你有一定的参考价值。
-
-
测字符串长度函数
-
函数定义 size_t strlen(const char*s)
-
函数功能
-
测字符串指针s指向的字符串中字符的个数,不包括‘\0‘
-
-
返回值:字符串中字符个数
-
举例
-
int main()
-
char str1[20] = "hello";
-
char *str2 = "hello"
-
printf("%d\n",sizeof(str1)); //20
-
printf("%d\n",sizeof(str2)); //4
-
printf("%d\n",strlen(str1)); //5
-
printf("%d\n",strlen(str2)); //5
-
-
sizeof 是个关键字,测量数据的占用内存空间大小
-
-
-
字符串拷贝函数
-
函数的定义:char *strcpy(char *dest,const char * src);
-
函数的说明:
-
拷贝src指向的字符串到dest指针指向的内存中,‘\0’也会拷贝
-
-
函数的返回值
-
目的内存的地址
-
-
注意:在使用此函数的时候,必须保证dest指向的内存空间足够大,否则会出现内存污染
-
-
char *strncpy(char *dest,const char * src,size_t n);
-
函数说明:
-
将src指向的字符串前n个字节,拷贝到dest指向的内存中
-
-
返回值:目的内存的首地址
-
注意:
-
strncpy 不拷贝 ‘\0‘
-
如果n大于src指向的字符串中的字符个数,则在dest后面填充n-strlen(src)个 ‘\0‘
-
-
举例
-
int main()
-
char buf[100] ="aaaaaaaaaaaaaaaaaa";
-
strcncpy(buf,"helloworld",5);
-
printf("%s\n",buf);
-
-
结果为 helloaaaaaaaaaaaaaaaaa 验证了不拷贝 ‘\0‘
-
-
-
字符串追加函数
-
函数定义 char*strcat(char * dest,const char*src);
-
函数功能:
-
strcat函数追加src字符串到dest指向的字符串的后面。追加的时候会追加‘\0‘
-
-
注意 保证dest指向的内存空间足够大
-
举例
-
int main()
-
char str[20] = "aa\0aaaaaaaaaaaaa";
-
char *src = "hello";
-
p = strcat(str,src); //将src的内容追加到 str后面
-
printf("%s\n",str);
-
结果为 aahello 验证了追加字符串的时候追加‘‘\0‘
-
-
-
char *strncat(char *dest,const char *src,size_t)
-
追加src指向的字符串的前n个字符,到dest指向的字符串的后面
-
注意如果n大于src的字符个数,则只将src字符串追加到dest指向的字符串的后面
-
举例
-
char str[20] ="aa\0aaaaaaaaaaaaaa";
-
char*src ="hello";
-
strncat(str,src,10);
-
printf("%s\n",str);
-
-
-
-
strcmp/strncmp 字符串 比较
-
函数定义: int strcmp(const char * s1,const char *s2)
-
函数说明
-
比较s1和s2 指向的字符串的大小
-
比较的方法:逐个字符去比较ASCII码,一旦比较出大小返回
-
如果所有字符都一样,则返回0
-
-
返回值
-
如果s1指向的字符串大于s2指向的字符串 返回1
-
如果s1指向的字符串小于s2指向的字符串 返回-1
-
如果相等的话 返回0
-
-
int strncmp(const char*s1,const char * s2,size_t n);
-
函数说明:比较s1和s2 指向的字符串中前n个字符
-
-
字符查找函数
-
函数定义: char *strchr(const char *s,int c);
-
函数说明:在字符指针s指向的字符串中,找ascii码为c的字符,注意,是首次匹配,如果过说s指向的字符串中有个ASCII为c的字符,则找的是第一个字符
-
返回值:
-
找到了返回找到的字符的地址
-
找不到返回NULL
-
-
函数定义 :char * strrchr (const char * s,int c);
-
函数的说明: 末次匹配
-
在s指向的字符串中,找最后一次出现的ASCII为c的字符
-
-
返回值:
-
末次匹配的字符的地址
-
-
-
字符串匹配函数
-
char * strstr (const char* haystack,const char *needle)
-
函数说明:
-
在haystack 指向的字符串中查找needle指向的字符串,也是首次匹配
-
-
返回值
-
找到了: 找到的字符串的首地址
-
没找到: 返回NULL
-
-
-
字符串转换数值
-
atoi /atol/atof //字符串转换功能
-
函数的定义: int atoi(const char*nptr);
-
函数的功能:
-
将nptr 指向的字符串转换成整数,返回
-
-
举例
-
int num;
-
num =atoi("123");
-
则num的值为123
-
-
long atol (const char*nptr); //返回一个长整型的数
-
double atof(const chat*nptr); //返回一个double类型的数
-
-
字符串切割函数
-
函数定义: char * strtok(char *str ,const char *delim);
-
函数的功能
-
字符串切割,按照delim指向的字符串中的字符,切割str指向的字符串,起始就是在str指向的字符串中发现了 delim字符串中的字符,就将其变量‘\0‘,调用一次 strtok只切割一次,切割一次之后,再去切割的时候strtok 的第一个参数传NULL,意思是接着上次切割的位置继续切
-
-
注意 如果str字符串中出现了连续的几个delim中的字符,则只将第一个字符变量‘\0‘
-
举例
-
int main()
-
char str [100] = “lucy : yuxin ,hanbing,xiaoyang:xueyang;zhanghu:yongheng”;
-
char*p[8];
-
int i= 0,j;
-
p[i] = strtok(str,",:;");
-
while(p[i]!=NULL)
-
-
i++;
-
p [i] = strtok(NULL,",:;");
-
-
for(j=0;j<i;j++)
-
-
printf("%s\n",p[j]);
-
-
-
-
-
格式化字符串操作函数
-
int sprintf (char * buf,const char* format,...);//输出到buf指定的内存区域
-
列如
-
char buf[20];
-
sprintf(buf,"%d:%d:%d",2013,10,1);
-
printf("buf=%s\n",buf);
-
-
int sscanf(const char * buf,const char *format,...) //从buf指定的内存区域中读入信息
-
列如
-
int a,b,c
-
sscanf("2013:10:1","%d:%d:%d",&a,&b,&c);
-
printf("%d %d %d\n",a,b,c);
-
-
-
sscanf 高级用法
-
跳过数据 %*s 或 % *d
-
列如
-
char buf[20];
-
sscanf("1234 5678","%*d%s",buf) ;// 跳过1234,然后隔一个空格获取字符串
-
printf("%s\n",buf);
-
-
-
读指定宽度的数据:%[width]s
-
列如
-
char buf[20];
-
sscanf("12345678", "%4s",buf); //从字符串中获取字符串,只要4个字节,存放在buf中
-
printf("%s\n",buf);
-
-
-
支持集合操作:只支持获取字符串
-
%[a-z] 表示匹配a到z 中任意字符 (尽可能多的匹配)
-
举例
-
char buf[20];
-
sscanf("agcd32DajfDdFF","%[a-z]",buf);//从字符中获取输入只要‘a‘ 和’z‘之间范围内的,就终止了
-
printf("%s\n",buf); //结果为agcd
-
-
%[aBc] 匹配 a、B、c中一员,贪婪性
-
%[ ^ aFc] 匹配非aFc的任意字符
-
% [ ^ a-z ] 表示读取除a-z以外的所有字符
-
-
练习
-
使用sscanf 读取# 号和@之间的字符串 abc#def@ghi
-
使用sscanf 读取"[02:06.85]" 02(代表分钟)06(代表秒)到整型变量 minute、second中
-
-
-
const: 用法
-
const 修饰普通变量,代表只读的意思
-
const int a =100; //定义了一个只读变量 a值为100
-
以后再程序中,不能再给a赋值了
-
-
const修饰指针
-
const char*str
-
意思是str指向的内存的内容不能通过str来修改
-
用来保护str指向的内存的内容,但是str 的指向是可以改变的
-
char *strcpy(char *dest,const char * src);
-
-
char* const str
-
意思是str 是只读的变量,str不能指向别的地方
-
但是str指向的内存的内容,是有可能可以修改的
-
-
const char * const str
-
str 不能指向别的地方。指向的内存的内容也不能通过str去修改
-
-
-
-
sscanf()的正则表达式是从头向后顺序查找匹配字符。找不到就返回错误,如下面的几个列子
-
char src[]="abcdefABCD123@456EFGghi";// 一个buf只对应一个%,%*可以用多次
-
sscanf(src,"%[A-Z]",buf);// buf =空 遇到A-Z以外的字符就停止,%表示选择,%后面的表示条件,条件s表示任意字符
-
sscanf(src,"%[ ^ A-Z]",buf);// buf=abcdef ^表示取反,即遇到A-Z之间的字符就结束
-
sscanf(src,"%[ ^A]",buf);// buf = abcdef, 从左向右获取除A以外的字符,遇到A结束
-
sscanf(src,"%*[ ^ A]",buf);// buf = 空, *表示后面匹配的字符不保存([ ^A] 本应该是abcdef,但因加了 *所以没有了即过滤掉了 )
-
sscanf(src,"%*[ ^A]%s",buf);//buf是ABCD123@456EFGghi , s表示获取字符串,虽然前面没有保存字符,但后面的字符可以获得并保存
-
sscanf(src,"%*[ ^A]%[ ^@]",buf); //buf = ABCD123 ,直到遇到A并包含A结束
-
sscanf(src,"%*[ ^A]A%[ ^@]",buf) //buf = BCD123,直到遇到A但不包含A结束,A为定界符
-
-
以上是关于字符串处理的主要内容,如果未能解决你的问题,请参考以下文章