字符串处理

一.字符串处理函数

 1.strlen

  原型:int strlen(const char *str)

  功能:返回字符串的实际长度,不含'\0'

#include <stdio.h>
#include <string.h>

int main(int argc,char *argv[])
{
    char str1[20] = "hello";
    char *str2 = "hello";
    printf("sizeof_str1 = %d\n",sizeof(str1));    //20
    printf("sizeof_str2 = %d\n",sizeof(str2));    //4
    printf("strlen_str1 = %d\n",strlen(str1));    //5
    printf("strlen_str1 = %d\n",strlen(str1));    //5
    return 0;
} 

 2.strcpy

  原型:char *strcpy(char *dest,const char *src)  //第二个参数用const修饰表示只读

  功能:把src所指向的字符串复制到dest所指向的空间中,'\0'也会拷贝

  返回值:返回dest字符串的首地址

 3.strncpy

  原型:char *strncpy(char *dest,const char *src,int num)

  功能:把src所指向的字符串的前num个复制到dest所指向的空间中,'\0'不会拷贝

  返回值:返回dest字符串的首地址

#include <stdio.h>
#include <string.h>

int main(int argc,char *argv[])
{
    char dest1[20] = "123456789";
    char dest2[20] = "123456789";
    char dest3[20];
    char *src = "hello world";
    
    strcpy(dest1,src);
    printf("dest1 = %s\n",dest1);    //hello world
    
    strncpy(dest2,src,5);
    printf("dest2 = %s\n",dest2);    //hello6789
    
    dest2[5] = '\0';
    printf("dest2 = %s\n",dest2);    //hello
    
    strncpy(dest3,src,5);
    printf("dest3 = %s\n",dest3);    //hello……乱码,后面没有\0
    
    dest3[5] = '\0';
    printf("dest3 = %s\n",dest3);    //hello
    return 0;
} 

 4.strcat

  原型:char *strcat(char *str1,char *str2)

  功能:将str2连接到str1后面,'\0'会一起拷贝过去

  返回值:返回str1字符串的首地址

 5.strncat

  原型:char *strncat(char *str1,char *str2,int num)

  功能:将str2前num个字母连接到str1后面,'\0'会一起拷贝过去

  返回值:返回str1字符串的首地址

#include <stdio.h>
#include <string.h>

int main(int argc,char *argv[])
{
    char str1[20] = "hello";
    char str2[20] = "hello";
    char *src = "Kitty hello";
    
    strcat(str1,src);
    printf("str1 = %s\n",str1);    //helloKitty hello
    
    strncat(str2,src,5);
    printf("str2 = %s\n",str2);    //helloKitty
    return 0;
}

 6.strcmp

  原型:int strcmp(char *str1,char *str2)

  功能:比较str和str2的大小

  返回值:相等返回0

      str1大于str2,返回>0

      str1小于str2,返回<0

 7.strncmp

  原型:int strncmp(char *str1,char *str2,int num)

  功能:比较str和str2前n个字符串的大小

  返回值:相等返回0

      str1大于str2,返回>0

      str1小于str2,返回<0

#include <stdio.h>
#include <string.h>

int main(int argc,char *argv[])
{
    char *str1 = "hello Kitty";
    char *str2 = "hello world";
    
    if(strcmp(str1,str2) == 0)
        printf("str1 = str2\n");
    else if(strcmp(str1,str2) > 0)
        printf("str1 > str2\n");
    else
        printf("str1 < str2\n");
        
    if(strncmp(str1,str2,5) == 0)
        printf("str1 = str2\n");
    else if(strncmp(str1,str2,5) > 0)
        printf("str1 > str2\n");
    else
        printf("str1 < str2\n");    
        
    return 0;
}

 二.字符串变换函数

 1.strchr  字符匹配函数

  原型:char* strchr(const char *str,char ch)

  功能:在字符串str中查找字母ch出现的位置

  返回值:如果找到,返回第一次出现的ch地址

      如果未找到,返回NULL

 2.strstr  字符串匹配函数

  原型:char* strstr(const char *str1,char* str2)

  功能:在字符串str1中查找字符串str2出现的位置

  返回值:如果找到,返回第一次出现的str2地址

      如果未找到,返回NULL

 3.memset  空间设定含税

  原型:void* memset(void *str,char c,int n)

  功能:将str所指向的内存区的前n个全部用c填充,常用于清楚指定空间,比如数组或malloc的空间

  返回值:返回str的地址 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
    char str1[20] = "hello $#$ Kitty";
    char *str2 = NULL;
    
    memset(str1,'*',strlen(str1));
    printf("str1 = %s\n",str1);    //str1 = ***************
        
    str2 = (char *)malloc(10*sizeof(char));
    memset(str2,0,10*sizeof(char));     
    printf("str2 = %s\n",str2);    //str2 =
    free(str2);
    return 0;
}

 4.atoi/atol/atof  字符串转换功能

  原型:int atoi(const char *str)

     long int atol(const char *str)

     double atof(const char *str)

  功能:将str所指向的数字字符串转化为int/long/doule

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
    char str1[] = "12345",str2[]="56789",str3[]="123.456";
    int num1;
    long int num2;
    double num3;
    
    num1 = atoi(str1);
    num2 = atol(str2);
    num3 = atof(str3);
    
    printf("num1 = %d,num2 = %ld,num3 = %lf\n",num1,num2,num3);    //num1 = 12345,num2 = 56789,num = 123.456000
    return 0;
}

 5.strtok  字符串分割函数

  原型:char *strtok(char str[],const char *delim)

  功能:strtok()用来将字符串分割成一个个片段

  参数1:str指向欲分割的字符串

  参数2:delim则为分割字符串中包含的所有字符

    • 当strtok()在参数str的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0字符,当连续出现多个时只替换第一个为\0。

    • 在第一次调用时:strtok()必须给予参数str字符串,往后的调用则将参数str设置成NULL,每次调用成功则返回指向被分割出片段的指针。

    • 切割完之后原字符串发生了改变。

#include <stdio.h>
#include <string.h>

int main(int argc,char *argv[])
{
    char str1[] = "abc*!$def*fhnbh!cdsn$*cndsk$!*hbh$ncdcbd";
    char *str2 = "*!$";
    char *result[10];
    int i,num = 0;
    
    result[num] = strtok(str1,str2);
    while(result[num] != NULL)
    {
        num++;
        result[num] = strtok(NULL,str2);
    }
    for(i = 0;i < num;i++)
        printf("result[%d] = %s\n",i,result[i]);
    printf("str1 = %s\n",str1);    //*被替换成了\0,所以只输出了abc
    return 0;
}

// 输出结果:
// result[0] = abc
// result[1] = def
// result[2] = fhnbh
// result[3] = cdsn
// result[4] = cndsk
// result[5] = hbh
// result[6] = ncdcbd
// str1 = abc

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

  • int sprintf(char *buf,const char *format, ……);  //输出到buf指定的内存区域

    例如:char buf[20];

       sprintf(buf,"%d:%d:%d",2017,11,25);

  • int sscanf(const char *buf,const char *format, ……);  //从buf指定的内存区域中读入信息

    例如:int a,b,c;

       sscanf("2017:11:25","%d:%d:%d",&a,&b,&c);

#include <stdio.h>
#include <string.h>

int main(int argc,char *argv[])
{
    char buf[200];
    int a,b,c;
    
    sprintf(buf,"%d:%d:%d",2017,11,25);
    printf("buf = %s\n",buf);    //buf = 2017:11:25
    
    sscanf("2017:11:25","%d:%d:%d",&a,&b,&c);
    printf("a = %d,b = %d,c = %d\n",a,b,c);    //a = 2017,b = 11,c = 25
    return 0;
}

四.标准I/O库函数

 sscanf高级用法

  1.跳过数据:%*s或%*d

    例如:sscanf("1234 5678","%*d %s",buf);  //5678

  2.读指定宽度的数据:%[width]s

    例如:sscanf("12345678","%4s",buf);  //1234

  3.支持集合操作

    • %[a-z] 表示匹配a到z中任意字符(尽可能多的匹配)

    • %[aBc]匹配a、B、c中一员,贪婪性

    • %[^a]匹配非a的任意字符,贪婪性  //碰到a就结束

    • %[^a-z]表示读取除a-z以外的所有字符  //碰到小写字母就结束了

#include <stdio.h>
#include <string.h>

int main(int argc,char *argv[])
{
    char buf[200];
    
    sscanf("1234 5678","%*d %s",buf);
    printf("buf = %s\n",buf);    //buf = 5678
    
    sscanf("12345678","%4s",buf);
    printf("buf = %s\n",buf);    //buf = 1234
    
    sscanf("123abcABC","%[1-9a-z]",buf);
    printf("buf = %s\n",buf);    //buf = 123abc
    
    sscanf("123abcABC","%[^A-Z]",buf);
    printf("buf = %s\n",buf);    //buf = 123abc
    
    sscanf("123456 abcdef","%[^ ]",buf);
    printf("buf = %s\n",buf);    //buf = 123456
    return 0;
}
posted @ 2017-11-25 23:05  lemongirl  阅读(271)  评论(0编辑  收藏  举报