字符串处理

Posted fengzi759

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串处理相关的知识,希望对你有一定的参考价值。

  1. 头文件 #include "string.h"

  2. 测字符串长度函数

    • 函数定义 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 是个关键字,测量数据的占用内存空间大小

  3. 字符串拷贝函数

    • 函数的定义: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‘

  4. 字符串追加函数

    • 函数定义 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);

  5. 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个字符

  6. 字符查找函数

    • 函数定义: char *strchr(const char *s,int c);

    • 函数说明:在字符指针s指向的字符串中,找ascii码为c的字符,注意,是首次匹配,如果过说s指向的字符串中有个ASCII为c的字符,则找的是第一个字符

    • 返回值:

      • 找到了返回找到的字符的地址

      • 找不到返回NULL

    • 函数定义 :char * strrchr (const char * s,int c);

    • 函数的说明: 末次匹配

      • 在s指向的字符串中,找最后一次出现的ASCII为c的字符

    • 返回值:

      • 末次匹配的字符的地址

  7. 字符串匹配函数

    • char * strstr (const char* haystack,const char *needle)

    • 函数说明:

      • 在haystack 指向的字符串中查找needle指向的字符串,也是首次匹配

    • 返回值

      • 找到了: 找到的字符串的首地址

      • 没找到: 返回NULL

  8. 字符串转换数值

    • 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类型的数

  9. 字符串切割函数

    • 函数定义: 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]);

  10. 格式化字符串操作函数

    • 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为定界符 

以上是关于字符串处理的主要内容,如果未能解决你的问题,请参考以下文章

PHP中字符串的处理

高分求一个批处理程序,判断一个字符串有没有中文字符

BAT批处理中的字符串处理详解(字符串截取)

ABAP 字符串处理

批处理中用for指令从文件读取字符串时如何对字符串进行判断

字符串处理