1、求字符串长度函数:strlen

  函数原型:

 size_t strlen(char const *string);

 2、复制字符串函数:strcpy

函数原型:

char *strcpy(char *dst,char const *src)

其中,dst 表示目标字符串的地址,src 表示源字符串的地址。strcpy 函数返回的是指向目标字符串的指针。

strcpy 函数的作用是将 src 指向的字符串复制到 dst 所指向的位置,包括字符串末的’\0’字符。由于原字符串必须以’\0’结尾,因此通常情况下为了防止越界,目标字符串空间应该比源字符串大至少1个字节。

3、 链接字符串:strcat

函数原型:

char *strcat(char *dest,char const *src);

strcat 是C语言中的一个字符串操作函数,用于将一个字符串追加到另一个字符串的末尾。

其中,dest 表示目标字符串的地址,src 表示源字符串的地址。strcat 函数返回的也是指向目标字符串的指针。dest开辟的空间一定要大于src的空间,否则会出错的。

4、 字符串比较函数:strcmp

函数原型:

int strcmp(const char *s1, const char *s2);

其中,s1 和 s2 分别表示需要比较的两个字符串的指针。strcmp 函数返回一个整数值,如果两个字符串相等,返回0;如果第一个字符串小于第二个字符串,返回一个负数;如果第一个字符串大于第二个字符串,返回一个正数。

5、长度受限的字符串函数 

char *strncpy(char *dst,char const *src,size_t len);

其中,dest 是目标字符串的地址,src 是源字符串的地址,n 表示需要复制的字符个数。该函数返回一个指向目标字符串的指针。

strncpy 函数将从 src 指向的字符串中复制 n 个字符到 dest 所指向的字符串中。如果 src 的长度小于 n,则在 dest 的其余位置填充 ‘\0’ 以保证 dest 的长度为 n。如果 src 的长度大于等于 n,则 dest 将不会以 ‘\0’ 结尾。


char *strncat(char *dst,char const *src,size_t len);

其中,dest 表示目标字符串的地址,src 表示源字符串的地址,n 表示需要追加的字符个数。该函数返回一个指向目标字符串的指针。

strncat 函数将从 src 指向的字符串中追加 n 个字符到 dest 所指向的字符串的末尾,并在 dest 追加的字符串的末尾添加一个 ‘\0’。如果 src 的长度小于 n,则在 dest 的其余位置填充 ‘\0’ 以保证 dest 的长度为 n。如果 src 的长度大于等于 n,则 dest 将不会以 ‘\0’ 结尾。


int strncmp(char const *s1,char const *s2,size_t len);

其中,s1 和 s2 分别表示需要比较的两个字符串的指针,n 表示需要比较的字符个数。strncmp 函数返回一个整数值,如果前 n 个字符相等,返回0;如果第一个字符串小于第二个字符串,返回一个负数;如果第一个字符串大于第二个字符串,返回一个正数。

strncmp 函数的比较方式与 strcmp 相似,不同之处在于 strncmp 比较的字符个数是通过第三个参数 n 来指定的。如果遇到结尾字符 ‘\0’ 或者比较字符达到 n 个,则停止比较并返回相应的结果。

6、字符串查找相关函数 

1、查找一个字符:strchr,strrchr

char *strchr(char const *str, int ch);

参数 str 是要搜索的字符串,参数 c 是要查找的字符。函数返回指向首次出现的字符 c 的指针,或者返回 NULL(如果未找到字符 c

char *strrchr(char const *str,int ch)

参数 str 是要搜索的字符串,参数 c 是要查找的字符。函数返回指向字符串中最后一个出现的字符 c 的指针,或者返回 NULL(如果未找到字符 c)。

注:这个函数区分大小写。


2、查找任何几个字符:strpbrk

char *strpbrk(char const *str,char const *group)

查找任何一组字符出现在字符串中出现的位置,这个函数返回一个指向str中第一个匹配group中任意字符的位置,如果未找到皮利佩,函数返回一个NULL指针。


3、查找一个字符串:strstr

char *strstr(char const *s1,char const *s2);

这个函数在s1中查找整个s2第一次出现的起始位置,并返回一个指向改位置的指针。如果s2并没有完整的出现在s1的任何地方,函数将返回一个NULL指针。如果第二个参数是一个空字符串,函数就返回s1。


4、查找标记函数:strtok

char *strtok(char *str,char const *sep);

第一次调用时,字符串 str 必须指向待扫描的字符串,后续调用时应将 str 设为 NULL。参数 delim 是分隔符,可以是单个分隔符字符,也可以是多个分隔符字符组成的字符串。strtok() 函数返回分割得到的字符串中第一个小字符串的指针。当没有小字符串需要处理时返回 NULL

在多次调用 strtok() 函数时,如果 str 不为 NULL,strtok() 函数会保留扫描位置的状态以便于下一次调用。因此,如果希望从一个字符串中提取多个 token,可以多次调用 strtok() 函数进行操作,每次调用函数时将 str 设为 NULL。


5、错误信息打印函数:strerror

char *strerror(int error_number);

参数 errnum 是需要转换的错误码,函数返回一个指针,指向一个描述错误信息的字符串。

代码示例:

/**
 * 字符串测试
 * 
*/
int string_test()
{
    char *p = "hello world";
    char *p1 = "good moring";
    char *p2 = "lisa:";
    char *dest = NULL;
    char *temp = NULL;
    char *dest_cat = NULL;
    dest = malloc(strlen(p)+1);
    if(dest == NULL)
    {
        DEBUG_LOG("erro malloc dest!!\n");
        return ERROR;
    }
    /*
    1、字符串复制函数以及求长度函数的使用
    */
    temp = strcpy(dest,p);
    DEBUG_LOG("p[%s][%d]  dest[%s][%d]  temp[%s][%d]]\n"\
                ,p,(int)strlen(p),dest,(int)strlen(dest),temp,(int)strlen(temp));
    /*
    operator_express.c string_test:29 p[hello world][11]  dest[hello world][11]  temp[hello world][11]]
    */

   /*
    2、连接字符串函数的使用
   */
    dest_cat = malloc(64);
    if(dest_cat == NULL)
    {
        DEBUG_LOG("error malloc dest_cat!!\n");
        return ERROR;
    }
    temp = NULL;
    temp = strcat(dest_cat,p2);
    DEBUG_LOG("%s    %s\n",dest_cat,temp);
    temp = strcat(dest_cat,p1);
    DEBUG_LOG("%s    %s\n",dest_cat,temp);
    temp = strcat(dest_cat,p);
    DEBUG_LOG("%s    %s\n",dest_cat,temp);
    /*
    operator_express.c string_test:49 lisa:    lisa:
    operator_express.c string_test:51 lisa:good moring    lisa:good moring
    operator_express.c string_test:53 lisa:good moringhello world    lisa:good moringhello world
    */
    free(dest_cat);
    free(dest);

    /*
    3、字符串比较函数
    */
    char *arrycmp1 = "hello";
    char *arrycmp2 = "he";
    char *arrycmp3 = "hello1";
    char *arryTest = "hello";
    int value = 0 ;
    value = strcmp(arrycmp1,arrycmp2);
    DEBUG_LOG("value = %d\n",value);
    value = strcmp(arrycmp1,arrycmp3);
    DEBUG_LOG("value = %d\n",value);
    value = strcmp(arrycmp1,arryTest);
    DEBUG_LOG("value = %d\n",value);
    /*
    operator_express.c string_test:78 value = 108
    operator_express.c string_test:80 value = -49
    operator_express.c string_test:82 value = 0
    */

    /*
    4、长度受限的字符串函数
    */
    char *n_strarry1 = "hello!!!";
    char *n_strarry2 = NULL;
    char *n_strarry3 = "hel";
    char *n_strarry4 = "lisa::";
    char *n_strarry5 = NULL;
    int n_temp = 0;
    char *n_tempstr = NULL;
    n_strarry2 = malloc(strlen(n_strarry1)+1);
    n_strarry5 = malloc(64);
    if(n_strarry2 == NULL || n_strarry5 == NULL)
    {
        DEBUG_LOG("error malloc n_str!!!\n");
    }
    n_tempstr = strncpy(n_strarry2,n_strarry1,5);
    DEBUG_LOG("n_tempstr[%s] n_strarry2[%s]\n",n_tempstr,n_strarry2);

    n_tempstr = strncat(n_strarry5,n_strarry4,strlen(n_strarry4)-1);
    DEBUG_LOG("n_strarry5[%s] n_tempstr[%s]\n",n_strarry5,n_tempstr);
    n_tempstr = strncat(n_strarry5,n_strarry1,strlen(n_strarry1)-1);
    DEBUG_LOG("n_strarry5[%s] n_tempstr[%s]\n",n_strarry5,n_tempstr);

    n_temp = strncmp(n_strarry1,n_strarry3,strlen(n_strarry3));
    DEBUG_LOG("n_temp[%d]\n",n_temp);

    n_temp = strncmp(n_strarry1,n_strarry3,strlen(n_strarry3)+1);
    DEBUG_LOG("n_temp[%d]\n",n_temp);

    n_temp = strncmp(n_strarry3,n_strarry1,strlen(n_strarry1)+1);
    DEBUG_LOG("n_temp[%d]\n",n_temp);

    /*
    operator_express.c string_test:106 n_tempstr[hello] n_strarry2[hello]
    operator_express.c string_test:109 n_strarry5[lisa:] n_tempstr[lisa:]
    operator_express.c string_test:111 n_strarry5[lisa:hello!!] n_tempstr[lisa:hello!!]
    operator_express.c string_test:114 n_temp[0]
    operator_express.c string_test:117 n_temp[108]
    operator_express.c string_test:120 n_temp[-108]
    */
    free(n_strarry2);
    free(n_strarry5);

    /*
    5:字符串查找函数
    */
    char str[] = "This is a test string!";
    char *t_str = NULL;
    t_str = strchr(str,'t');
    if(t_str != NULL)
    {
        DEBUG_LOG("t_str[%s] %d %d\n",t_str,(int)(t_str-str),(int)strlen(str));
    } 
    t_str = strrchr(str,'t');
    if(t_str != NULL)
    {
        DEBUG_LOG("t_str[%s] %d %d\n",t_str,(int)(t_str-str),(int)strlen(str));
    } 
    /**
     * operator_express.c string_test:141 t_str[test string!] 10 22
     * operator_express.c string_test:146 t_str[tring!] 16 22
    */
    t_str = strpbrk(str,"tnig");
    {
        DEBUG_LOG("t_str[%s] %ld\n",t_str,t_str-str);
    }
    /**
     * operator_express.c string_test:153 t_str[is is a test string!] 2
    */
   t_str = strstr(str,"test");
   if(t_str != NULL)
   {
        DEBUG_LOG("t_str[%s]   [%ld]\n",t_str,t_str - str);
   }
   /**
    * operator_express.c string_test:162 t_str[test string!]   [10]
   */
    char str0[] = "This is a strtok test!!!";
    char str1[] = "gnss;gess;gass;gpss";
    char *sep;
    sep = strtok(str0," ");
    DEBUG_LOG("sep [%s]\n",sep);
    while(sep != NULL)
    {
        sep = strtok(NULL," ");
        DEBUG_LOG("sep[%s]\n",sep);
    }

    sep = strtok(str1,";");
    DEBUG_LOG("sep [%s]\n",sep);
    while (sep != NULL)
    {
        sep = strtok(NULL,";");
        DEBUG_LOG("sep[%s]\n",sep)
    }


    return OK;
}