字符及字符串操作(1)——<string.h>中C/C++库函数详解及实例

目录

1、memcmp:数据比较函数(区分字母大小写)

2、 memicmp:数据比较函数(不区分字母大小写)

3、strcmp:字符串比较函数(区分字母大小写)

4、stricmp(strcmpi):字符串比较函数(不区分字母大小写)

5、strncmp:字符串子串比较函数(区分字母大小写)

6、strnicmp(strncmpi):字符串子串比较函数(不区分字母大小写)

7、memcpy: 数据拷贝函数(不可用于重叠存储)

8、memccpy: 数据拷贝函数(遇指定字符编码停止)

 9、memmove: 数据拷贝函数(可用于重叠存储)

10、strcpy:字符串拷贝函数

11、strncpy:字符串子串拷贝函数

12、strdup:字符串新建拷贝函数

13、memchr:字符搜索函数

14、memrchr:字符逆向搜索函数

15、strchr:字符串中字符首次匹配函数

16、strrchr:字符串中字符末次匹配函数

17、strstr:字符串匹配函数

18、strspn:字符集匹配函数

19、strcspn:字符集逆匹配函数

20、strpbrk:字符集字符匹配函数

21、Strcat:字符串连接函数

22、strncat:字符串连接子串函数

23、strupr:字符串小写-大写转换函数

24、strlwr:字符串大写-小写转换函数

25、memset:数据设定函数

26、strset:字符串设定函数

27、strnset:字符串子串设定函数

28、strlen:计算字符串长度函数

29、strrev:字符串倒转函数

30、strtok:字符串分隔函数


1、memcmp:数据比较函数(区分字母大小写)

函数原型及源码:int memcmp(const void *buffer1,const void *buffer2,int count);

int memcmp(const void *buffer1,const void *buffer2,int count)
{
   if (!count)
      return(0);
   while ( --count && *(char *)buffer1 == *(char *)buffer2)
   {
      buffer1 = (char *)buffer1 + 1;
      buffer2 = (char *)buffer2 + 1;
   }
   return( *((unsigned char *)buffer1) - *((unsigned char *)buffer2) );
}

函数功能:把存储区 buffer1和存储区 buffer2的前count个字节的码值进行逐个比较,比较过程区分大小写,即‘a’大于‘A’。

返回值:当buffer1中字符的码值大于、等于、小于buffer2相同位置的字符码值时,分别返回大于、等于、小于0的值。

例:

        char *buf1 = "123456\n";
		char *buf2 = "123456\n";
		char *buf3 = "123455\n";
		char *buf4 = "123457\n";
		int rtn;
		rtn = memcmp(buf1,buf2,10);
		printf("src1等于src2:%d\n", rtn);
		rtn = memcmp(buf1, buf3, 10);
		printf("src1大于src2:%d\n", rtn);
		rtn = memcmp(buf1, buf4, 10);
		printf("src1小于src2:%d\n", rtn);

执行结果:

2、 memicmp:数据比较函数(不区分字母大小写)

函数原型及源码:int memicmp(const void *buffer1,const void *buffer2,int count);

#define CHRTOLOW(p)  (((p) >= 'A'&& (p) <= 'Z') ? ((p) + 0x20) : (p))

int memicmp(const void *buffer1, const void *buffer2, int count)
{
	int f = 0;
	int l = 0;
	while (count--)
	{
		if ((*(unsigned char *)buffer1 == *(unsigned char *)buffer2) ||
			((f = CHRTOLOW(*(unsigned char *)buffer1)) == (l = CHRTOLOW(*(unsigned char *)buffer2))))
		{
			buffer1 = (char *)buffer1 + 1;
			buffer2 = (char *)buffer2 + 1;
		}
		else

			break;

	}
	return (f - l);
}

函数功能:把存储区 buffer1和存储区 buffer2的前count个字节的码值进行逐个比较,比较过程不区分字母大小写,即‘a’等于‘A’。

返回值:当s1中字符的码值大于、等于、小于s2相同位置的字符码值时,分别返回大于、等于、小于0的值。

例:

	char *buf1 = "abcde\n";
	char *buf2 = "ABCDE\n";
	char *buf3 = "abcdG\n";
	char *buf4 = "abcdA\n";
	int rtn;
	rtn = memicmp(buf1, buf2, 5);
	printf("src1等于src2:%d\n", rtn);
	rtn = memicmp(buf1, buf3, 5);
	printf("src1大于src2:%d\n", rtn);
	rtn = memicmp(buf1, buf4, 5);
	printf("src1小于src2:%d\n", rtn);

执行结果:

3、strcmp:字符串比较函数(区分字母大小写)

函数原型及源码:int strcmp (const char *str1,const char * str2)

int strcmp(const char* str1, const char* str2)
{
	int ret = 0;
	while(!(ret=*(unsigned char*)str1-*(unsigned char*)str2) && *str1)
	{str1++;str2++}

	if (ret < 0){return -1;}
	else if (ret > 0)

	{return 1;}
	return 0;
}

函数功能:把存储区 str1和存储区 str2的字符串的码值进行逐个比较,只对字符串比较,比较过程区分大小写,即‘a’大于‘A’。

返回值:str1中字符的码值大于、等于、小于str2相同位置的字符码值时,分别返回大于、等于、小于0的值。

    char *buf1 = "ABCDEF\n";
	char *buf2 = "ABCDEF\n";
	char *buf3 = "ABCDEE\n";
	char *buf4 = "abcdef\n";
	int rtn;
	rtn = strcmp(buf1, buf2);
	printf("src1等于src2:%d\n", rtn);
	rtn = strcmp(buf1, buf3);
	printf("src1大于src2:%d\n", rtn);
	rtn = strcmp(buf1, buf4);
	printf("src1小于src2:%d\n", rtn);

执行结果

4、stricmp(strcmpi):字符串比较函数(不区分字母大小写)

函数原型及源码:int stricmp(const char *str1, const char *str2)

int stricmp(const char *str1, const char *str2)
{
   int ch1, ch2;
   do
   {
      if ( ((ch1 = (unsigned char)(*(str1++))) >= 'A') &&(ch1 <= 'Z') )
        ch1 += 0x20;

      if ( ((ch2 = (unsigned char)(*(str2++))) >= 'A') &&(ch2 <= 'Z') )
        ch2 += 0x20;

   } while (ch1&&(ch1 == ch2));
   return(ch1- ch2);
}

函数功能:其功能是把存储区 str1和存储区 str2的字符串的码值进行逐个比较,与只能对字符串比较,比较过程不区分大小写,即‘a’等于‘A’。

返回值:str1中字符的码值大于、等于、小于str2相同位置的字符码值时,分别返回大于、等于、小于0的值。

例:

	char *buf1 = "abcde\n";
	char *buf2 = "ABCDE\n";
	char *buf3 = "abcdD\n";
	char *buf4 = "abcdf\n";
	int rtn;
	rtn = stricmp(buf1, buf2);
	printf("src1等于src2:%d\n", rtn);
	rtn = stricmp(buf1, buf3);
	printf("src1大于src2:%d\n", rtn);
	rtn = stricmp(buf1, buf4);
	printf("src1小于src2:%d\n", rtn);

执行结果

5、strncmp:字符串子串比较函数(区分字母大小写)

 函数原型及源码:int strncmp (char *str1,char * str2, int count)

int strncmp(const char *str1,const char *str2,int count)
{
   if (!count)
      return(0);

   while (--count && *str1&& *str1== *str2)str1++,str2++;

   return( *(unsigned char *)str1- *(unsigned char *)str2);
}

函数功能:其功能是把存储区 str1和存储区 str2的字符串前count码值进行逐个比较,与只能对字符串比较,比较过程区分大小写,即‘a’大于‘A’。

返回值:str1中字符的码值大于、等于、小于str2相同位置的字符码值时,分别返回大于、等于、小于0的值。

例:

	char *buf1 = "ABCDEFg\n";
	char *buf2 = "ABCDEFh\n";
	char *buf3 = "ABCDEE\n";
	char *buf4 = "abcdef\n";
	int rtn;
	rtn = strncmp(buf1, buf2,6);
	printf("前6字符src1等于src2:%d\n", rtn);
	rtn = strncmp(buf1, buf3, 6);
	printf("前6字符src1大于src2:%d\n", rtn);
	rtn = strncmp(buf1, buf4, 6);
	printf("前6字符src1小于src2:%d\n", rtn);

输出结果

6、strnicmp(strncmpi):字符串子串比较函数(不区分字母大小写)

函数原型及源码:int strnicmp(const char *str1,const char *str2,int count)

int strnicmp(const char *str1,const char *str2,int count)
{
   int ch1, ch2;
   do
   {
      if ( ((ch1 = (unsigned char)(*(str1++))) >= 'A') &&(ch1 <= 'Z') )
        ch1 += 0x20;

      if ( ((ch2 = (unsigned char)(*(str2++))) >= 'A') &&(ch2 <= 'Z') )
        ch2 += 0x20;

   } while ( --count && ch1 && (ch1 == ch2) );

   return (ch1 - ch2);
}

函数功能:其功能是把存储区 str1和存储区 str2的字符串前count码值进行逐个比较,与只能对字符串比较,比较过程不区分大小写,即‘a’等于‘A’。

返回值:str1中字符的码值大于、等于、小于str2相同位置的字符码值时,分别返回大于、等于、小于0的值。

例:

    char *buf1 = "abcdeF\n";
	char *buf2 = "ABCDEF\n";
	char *buf3 = "abcdGF\n";
	char *buf4 = "abcdAF\n";
	int rtn;
	rtn = strnicmp(buf1, buf2, 5);
	printf("前5字符src1等于src2:%d\n", rtn);
	rtn = strnicmp(buf1, buf3, 5);
	printf("前5字符src1大于src2:%d\n", rtn);
	rtn = strnicmp(buf1, buf4, 5);
	printf("前5字符src1小于src2:%d\n", rtn);

执行结果:

7、memcpy: 数据拷贝函数(不可用于重叠存储)

函数原型及源码:void *memcpy(void *dst,const void *src,int count)


void * memcpy(void *dst,const void *src,int count)
{
   void * ret = dst;
   while (count--)
   {
      *(char *)dst = *(char *)src;
      dst = (char *)dst + 1;
      src = (char *)src + 1;
   }
   return(ret);
}

函数功能:从src所指的存储中复制count个字节数据到dst所指的存储中。但是,如果这种复制发生在重叠对象之间,其行为是不可预知的

返回值:目标数据地址dst

注意事项:如果复制过程中发生在重叠对象之间,其行为是不可预知的

例:

	char *buf1 = "abcdeF";
	char buf2[10] = "*********";
	char buf3[10] = "abcdefg";
	char *rtn;
	rtn = memcpy(&buf2[0], buf1,5);
	printf("拷贝5个字符:%s\n", rtn);

	rtn = memcpy(&buf3[2], &buf3[0], 7);
	printf("字符后移2位(重叠):%s\n", rtn);

输出结果

8、memccpy: 数据拷贝函数(遇指定字符编码停止)

函数原型及源码:void * memccpy(void *dest, const void *src, int c, int count)

void * memccpy(void *dest,const void *src,int c,int count)

{
      while ( count && (*((char *)(dest = (char *)dest + 1) - 1) =

   *((char *)(src = (char *)src + 1) - 1)) != (char)c )

        count--;

   return(count ? dest : NULL);

}

函数功能:由src所指内存区域复制不大于count个字节到dest所指内存区域,如果遇到字符c则停止复制。

返回值:返回指向字符ch后的第一个字符的指针(复制的数据包含c),如果src前n个字节中不存在ch则返回NULL。

    char *buf1 = "abcdeF";
	char buf2[10] = "123456";
	char *rtn;
	rtn = memccpy(&buf2[0], buf1,'b',5);
	printf("拷贝5个字符遇b结束:%s\n", buf2);
	printf("拷贝5个字符遇b结束,返回位置:%s\n", rtn);

执行结果

 9memmove数据拷贝函数(可用于重叠存储)

函数原型及源码:void *memmove(void *dst, const void * src, size_t count);


void *memmove(void *dst, const void * src, size_t count)
{
    assert((dst != NULL) && (src != NULL));
    char *tmp_dst = (char *)dst;
    char *tmp_src = (char *)src;
    
    if (tmp_dst + count < src || tmp_src + count < dst)
    {
        while (count--)
            *tmp_dst++ = *tmp_src++;
    }
    else
    {
        tmp_dst += count - 1;
        tmp_src += count - 1;
        
        while (count--)
            *tmp_dst-- = *tmp_src--;
    }
 
    return dst;
}

函数功能:从src所指内存区域复制count个字节到临时缓存,再由临时缓存复制到dest所指内存区域。当对象重叠时,该函数仍能正确执行。

返回值:目标地址dst

	char *buf1 = "abcdeF";
	char buf2[10] = "*********";
	char buf3[10] = "abcdefg";
	char *rtn;
	rtn = memmove(&buf2[0], buf1,5);
	printf("拷贝5个字符:%s\n", rtn);

	rtn = memmove(&buf3[2], &buf3[0], 7);
	printf("字符后移2位(重叠):%s\n", rtn);

10、strcpy:字符串拷贝函数

函数原型及源码: char * strcpy(char * dst, const char * src);

char * strcpy(char * dst, const char * src)
{
   char *cp = dst;
   while( *cp++ = *src++ )  ;        
   return( dst );
}

函数功能:把字符串src中的内容拷贝到字符串dest中(包含src最后的'\0'),使两个字符串的内容相同。

返回值:指向字符串dest的地址

例:代码简单,省略例程。

11、strncpy:字符串子串拷贝函数

函数原型及源码:char *strncpy(char *dest, const char *source, int count)

char *strncpy(char *dest, const char *source, int count)
{
   char *p = dest;
   while (count && (*p++ = *source++)) count--;
   while(count--)
      *p++ = '/0';
   return(dest);
}

函数功能:也就是把字符串source中的前count个字符拷贝到字符串dest中。

返回值:指向字符串dest的指针

例:与memcpy功能相似,但是只对字符串进行操作,可参照memcpy的实例。

12、strdup:字符串新建拷贝函数

函数原型及源码:char *strdup(const char *str)

char *strdup(const char *str)
{
   char *p;
   if (!str)
      return(NULL);
   if (p = malloc(strlen(str) + 1))
      return(strcpy(p,str));
   return(NULL);
}

函数功能:将str指向的字符串拷贝到一块新分配的存储空间,其内部使用动态分配内存技术实现的,分配给字符串的空间来自于当前所用内存模式制定的堆。

返回值:返回指向含有该串拷贝的存储区。

注意事项:该函数用到了动态内存分配malloc,为了避免内存溢出,当使内存用完成后,必须调用free函数进行内存回收。

例:

    char *buf1 = "abcdeF";
	char *rtn;
	rtn = strdup(buf1);
	printf("动态内存:%s\n", rtn);
	// 使用完释放
	free(rtn);

执行结果

13、memchr:字符搜索函数

函数原型及源码:extern void *memchr(const void * buffer,int ch,int count)

void * memchr(const void * buffer,int ch,int count)
{
   while ( count && (*(unsigned char *)buffer != (unsigned char)ch) )
   {

      buffer = (unsigned char *)buffer + 1;
        count--;
   }
   return(count ? (void *)buffer : NULL);
}

函数功能:在数组buffer的前count个字节中搜索字符 ch。

返回值:如果搜到字符 ch,返回ch在buf中第一次出现的地址。反之,返回NULL。

例:

char *buf = "ABCDEFGHIJK\n";
char *p;
// 搜到
p = memchr(buf, 'K', strlen(buf));
printf("OK-%s", p);
// 搜不到
p = memchr(buf, 'M', strlen(buf));
printf("NO-%d", p);

运行结果:

14、memrchr:字符逆向搜索函数

函数原型及源码:void * memrchr(const void * buffer,int ch,int count)

void * memrchr(const void * buffer,int ch,int count)
{
    int i=0;
    while(*(unsigned char *)buffer)
    {
       ((unsigned char *)buffer)++;
        i++;
    }
    count=count<i?count:i;

    while(count&&(*(unsigned char *)buffer!=(unsigned char)ch))
    {

      buffer = (unsigned char *)buffer- 1;
      count--;
    }
    return(count ? (void *)buffer : NULL);
 }

函数功能:在字符串中buffer中从后向前搜索ch,搜索长度不超过count个字符。

返回值:如果搜到字符 ch,返回ch在buf中第一次出现的地址。反之,返回NULL。

例:

	char buf[20] ="123456789";
	char *rtn;
	rtn = memrchr(buf,'7',10);
	printf("返回值:%s\n", rtn);

执行结果

15、strchr:字符串中字符首次匹配函数

函数原型及源码:char *strchr(const char *str, int ch)

char *strchr(const char *str, int ch)
{
   while (*str && *str != (char)ch)
        str++;
   if (*str == (char)ch)
        return((char *)str);
   return(NULL);
}

函数功能:从前向后,在字符串str中查找字符ch第一次出现的位置。

返回值:如果搜到字符 ch,返回ch在buf中第一次出现的地址。反之,返回NULL。

例:

    char *buf = "ABCDEFGHIJK\n";
	char *p;
	// 搜到
	p = strchr(buf, 'K', strlen(buf));
	printf("OK-%s", p);
	// 搜不到
	p = strchr(buf, 'M', strlen(buf));
	printf("NO-%d", p);

执行结果

16、strrchr:字符串中字符末次匹配函数

函数原型及源码:char *strrchr(char *str, char ch); 

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

{
   char *p = (char *)str;
   while (*str) str++;
   while (str-- != p && *str != (char)ch);
   if (*str == (char)ch)
        return( (char *)str );
   return(NULL);
}

函数功能:从后向前,在字符串str中查找字符ch第一次出现的位置。

返回值:如果搜到字符 ch,返回ch在buf中第一次出现的地址。反之,返回NULL。

例:

    char *buf = "ABCABCABC\n";
	char *p;
	// 搜到
	p = strrchr(buf, 'A', strlen(buf));
	printf("OK-%s", p);
	// 搜不到
	p = strrchr(buf, 'M', strlen(buf));
	printf("NO-%d", p);

执行结果

17、strstr:字符串匹配函数

函数原型及源码:char *strstr(char *s1, char *s2); 

char *strstr(const char *s1,const char *s2)
{
   if (*s1 == 0)
    {
      if (*s2)	return (char *) NULL;
      return (char *) s1;
    }
   while (*s1)
   {
      size_t i;
      i = 0;
      while (1)
      {
        if (s2[i] == 0) {return (char *) s1;}
        if (s2[i] != s1[i]) {break;}
        i++;
      }
      s1++;
   }
   return (char *) NULL;
}

函数功能:在字符串s1中查找第一次出现字符串s2的位置。

返回值:如果找到匹配字符串,返回第一次匹配字符串的指针;否则,返回NULL

    char *buf = "abcABCabc\n";
	char *p;
	// 搜到
	p = strstr(buf, "ABC");
	printf("OK-%s", p);
	// 搜不到
	p = Mstrstr(buf, "MLN");
	printf("NO-%d", p);

执行结果

 

18、strspn:字符集匹配函数

函数原型及源码:int strspn(char *s1, char *s2); 

int strspn(const char *s1 ,const char *s2)

{
   const char *s = s1;
   const char *p;
   while (*s1)
   {
      for (p = s2; *p; p++)
      {
        if (*s1 == *p)
           break;
      }

      if (*p == '/0')  break;

      s1++;
   }
   return s1 - s;
}

函数功能:在字符串s1中查找第一个不属于s2字符集合的下标,顺序为从前向后。换句话说,若果返回值为7,表示字符串s1的前7个字符都在s2字符集合中。

返回值:所找到的字符在字符串s1中段的相对位置(下标)。

例:

	char *buf = "0123456789";
	char *buf1 = "1234567abc456";
	int rtn;
	// 找到字符串中第一个不是数字的位置
	rtn = strspn(buf1, buf);
	printf("找到字符串中第一个不是数字的位置:%d", rtn);

执行结果

19、strcspn:字符集逆匹配函数

函数原型及源码:int strcspn(char *s1, char *s2); 

int strcspn(const char *s1 ,const char *s2)
{
   const char *s = s1;
   const char *p;
   while (*s1)
   {
      for (p = s2; *p; p++)
      {
        if (*s1 == *p)
           break;
      }
      if (*p)  break;
      s1++;
   }
   return s1 - s;
}

函数功能:在字符串s1中查找第一个属于s2字符集合的下标,顺序为从前向后。换句话说,若果返回值为6,表示字符串s1的前6个字符都不在s2字符集合中。。

返回值:所找到的字符在字符串s1中段的相对位置(下标)

char *buf = "0123456789";
	char *buf1 = "abcdfe123abcdfe";
	int rtn;
	// 找到字符串中第一个数字的位置
	rtn = strcspn(buf1, buf);
	printf("找到字符串中第一个数字的位置:%d", rtn);

20、strpbrk:字符集字符匹配函数

函数原型及源码:char *strpbrk(char *s1, char *s2); 

char * strpbrk(const char *s1 ,const char *s2)
{
   const char *c = s2;
   if (!*s1)
      return (char *) NULL;
   while (*s1)
   {
      for (c = s2; *c; c++)
      {
        if (*s1 == *c)
           break;
      }
      if (*c)
        break;
      s1++;
   }
   if (*c == '/0')
      s1 = NULL;
   return (char *) s1;
}

函数功能:在源字符串(s1)中找出最先含有搜索字符串(s2)中任一字符的位置。

返回值:返回第一个匹配字符的指针,若找不到则返回空指针

例:

    char *buf = "0123456789";
	char *buf1 = "abcdfe123abcdfe";
	char *rtn;
	// 找到字符串中第一个数字的位置
	rtn = strpblk(buf1, buf);
	printf("找到字符串中第一个数字的指针:%s", rtn);

执行结果

21、Strcat:字符串连接函数

函数原型及源码:char *strcat (char *dest,char *src);

char * strcat(char * dest, const char * src)
{
        char *tmp = dest;
        while (*dest)
               dest++;
        while ((*dest++ = *src++) != '\0')
                ;
        return tmp;
}

函数功能:将两个字符串连接合并成一个字符串,即把字符串src连接到字符串dest后面,连接后的结果放在字符串dest中

返回值:指向字符串dest的指针

例:

char buf[10]="abcd";
	char *buf1 = "1234";
	char *rtn;
	// 找到字符串中第一个数字的位置
	rtn = strcat(buf, buf1);
	printf("字符串连接:%s", rtn);

执行结果 

22、strncat:字符串连接子串函数

函数原型及源码:char * strncat(char *dest,const char *source,int count)

char * strncat(char *dest,const char *source,int count)
{
   char *p = dest;
   while (*p) p++;
   while (count-- && (*p++ = *source++));
   *p = '\0';
   return(dest);
}

函数功能:将一个字符串的子串连接到另一个字符串末端,也就是把字符串src的前count个字符连接到字符串dest后面,连接后的结果放在字符串dest中。

返回值:指向字符串dest的指针

例:

    char buf[10] = "abcd";
	const char *buf1 = "1234";
	char *rtn;
	// 找到字符串中第一个数字的位置
	rtn = strncat(buf, buf1,2);
	printf("字符串连接:%s", rtn);

23、strupr:字符串小写-大写转换函数

 函数原型及源码:char *strupr(char *str);

char * strupr(char *str)
{
   char *p = str;
   while (*p != '\0')
   {
      if(*p >= 'a' && *p <= 'z')  *p -= 0x20;

      p++;
    }
   return str;
}

函数功能:将字符串str中小写字符全部转换为大写字符。

返回值:返回指向被转换字符串的指针

例:

    char buf[10] ="abcDE";
	char *rtn;
	// 小写转大写
	rtn = strupr(buf);
	printf("小写转大写:%s", rtn);

执行结果

24、strlwr:字符串大写-小写转换函数

 函数原型及源码:strlwr(char *str)

strlwr(char *str)
{
   char *p = str;
   while (*p != '\0')
   {
      if(*p >= 'A' && *p <= 'Z')	*p = (*p) + 0x20;
      p++;
    }
  return str;
}

函数功能:将字符串str中的所有大写字符变成小写字符。

返回值:返回指向被转换字符串的指针

例:

    char buf[10] ="abcDE";
	char *rtn;
	// 大写转小写
	rtn = strlwr(buf);
	printf("大写转小写:%s", rtn);

执行结果

25、memset:数据设定函数

函数原型及源码:void *memset(void *dst,int val,int count)

void * memset(void *dst,int val,int count)
{
   void *p = dst;
   while (count--)
   {
      *(char *)dst = (char)val;
        dst = (char *)dst + 1;
   }
   return p;
}

函数功能:将dst所指存储的前count自己设置为val,常用作初始化局部变量。
返回值:dst的值。

例:将局部数组int a[10]初始化为全0 :memset(a,0,sizeof(a));

26、strset:字符串设定函数

函数原型及源码:函数原型:char *strset(char *str, char c);

char * strset(char *str,char c)
{
   char *p = str;
   while (*str)
      *str++ = (char)c;
   return(p);
}

函数功能:将字符串str中的所有字符全部用字符c进行替换.

返回值:返回指向被替换字符串的指针

例:将局部字符串char a[10]初始化为全'\0' :strset(a,'\0',sizeof(a));

27、strnset:字符串子串设定函数

函数原型及源码:char * strnset(char * str,char c,int count)

char * strnset(char * str,char c,int count)

{

   char *p = str;

   while (count-- && *p)

      *p++ = (char)c;

   return(p);

}

函数功能:将字符串str前count个字符设定为指定字符c.

返回值:返回指向未被设定字符的指针

例:

    char buf[20] ="123456789";
	char *rtn;
	rtn = strnset(buf,'a',5);
	printf("替换后:%s\n", buf);
	printf("返回值:%s\n", rtn);

执行结果

28、strlen:计算字符串长度函数

函数原型及源码:int strlen(const char * str )

int strlen(const char * str )
{
   const char *p = str;
    while( *p++ ) ;
    return( (int)(p - str - 1) );
}

函数功能:求字符串的长度,也就是求字符串str中有多少个字符,遇'\0'结束计算,计算长度不包含'\0'。

返回值:字符串str字符的个数。

例:strlen("123456789");计算结果为9

29、strrev:字符串倒转函数

函数原型及源码:函数原型:char *strrev(char *str);

char * strrev(char *str)
{
   char *right = str;
   char *left = str;
   char ch;
   while (*right)   right++;
   right--;
   while (left < right)
   {
       ch = *left;
        *left++ = *right;
        *right-- = ch;
   }
   return(str);
}

函数功能:将字符串进行倒转,也就是将字符串str中的第一个字符与最后一个字符交换,第二个字符与倒数第二个字符交换,以此类推。

返回值:返回倒转后字符串的指针

    char buf[20] ="123456789";
	char *rtn;
	rtn = strrev(buf);
	printf("%s\n", rtn);

执行结果

30、strtok:字符串分隔函数

函数原型及源码:char *strtok (char *s,const char *delim)

char *strtok (char *s,const char *delim)
{
  static char *olds;
  char *token;
  if (s == NULL) s = olds;
 //将指针移到第一个非delim中的字符的位置
  s+=strspn (s,delim);
  if (*s == '\0')
  {
     olds = s;
     return NULL;
  }
  token = s;
  //将指针移到第一个delim中的字符的位置
  s = strpbrk(token, delim);
  if (s == NULL)
  {
	olds = strchr(token, '\0');
  }
  else
  {
	// 将分割符替换为空字符
     *s = '\0';
     olds = s + 1;
  }
  return token;
}

函数功能:在字符串str1中查找由字符串str2定义的分隔符,以分隔符为界,分隔出分隔符前面的字符组成一个单词,分离出第一个单词后将第一个参数置为空,可以继续分隔第二个单词。

返回值:返回分隔出的单词的指针

例:分割IP地址192.168.1.2

    char buf[20] ="192.168.1.2";
	char *rtn;
	rtn = buf;
	rtn = strtok(buf,".");
	printf("%s\n", rtn);
	rtn = strtok(NULL, ".");
	printf("%s\n", rtn);
	rtn = strtok(NULL, ".");
	printf("%s\n", rtn);
	rtn = strtok(NULL, ".");
	printf("%s\n", rtn);

执行结果

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿来不是梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值