C语言string.h文件函数汇总详解

注:下列例程执行结果由VC++6.0环境编译运行测试,确保验证无误。

一、常用函数

1.strcpy

函数原型:char *strcpy(char *destin, char *source);
函数功能:把含有’\0’结束符的字符串source(包含’\0’)复制到另一个地址空间destin。

使用例程:

#include<stdio.h>
#include<string.h>
 
int main(void)
{
	char string[10]={0};
	char*str1="abcdefghi";
	 
	strcpy(string,str1);
	 
	printf("%s\n",string);
	 
	return 0;
}

结果:
在这里插入图片描述

2.strncpy

函数原型:char *strncpy(char *dest, char *src,size_tn);
函数功能:将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL才停止复制,而是等凑够n个字符才停止复制),返回指向dest的指针。

使用例程:

#include<stdio.h>
#include<string.h>
 
int main(void)
{
	char string[10]={0};
	char*str1="abcdefghi";
	 
	strncpy(string,str1,3);
	 
	printf("%s\n",string);
	 
	return 0;
}

结果:
在这里插入图片描述

3.strstr

函数原型:char *strstr(char *str1, char *str2);
函数功能:找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)
返回值: 返回该位置的指针,如找不到,返回空指针
使用例程:

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

int main(void)
{
  char *str1 = "Borland International", *str2 = "nation", *ptr;
  ptr = strstr(str1, str2);
  printf("The substring is: %s\n", ptr);
  return 0;
}

结果:
在这里插入图片描述

4.strcmp

函数原型:int strcmp(char * str1,char * str2);
函数功能:比较两个字符串str1,str2
返回值:str1<str2,返回负数;str1=str2,返回 0;str1>str2,返回正数
使用例程:

int main()
{

    char dest[10]="abcd";
    char *src="a23456";
    char d2[8]="abcd";
    int res;
    res=strcmp(dest, src);
    printf("res= %d \n", res);
    res=strcmp(dest, d2);
    printf("res= %d \n", res);

    return 0;
}

结果:
在这里插入图片描述

5.strncmp

函数原型:int strncmp(char *str1,char *str2,int count)
函数功能:对str1和str2中的前count个字符按字典顺序比较
返回值:小于0:str1<str2,等于0:str1=str2,大于0:str1>str2
使用例程:

int main()
{

    char dest[10]="abcd";
    char *src="a23456";
    char d2[8]="abcd";
    int res;
    res=strncmp(dest, src, 3);
    printf("res= %d \n", res);
    res=strncmp(dest, d2, 3);
    printf("res= %d \n", res);

    return 0;
}

结果:
在这里插入图片描述

6.strchr

函数原型:char* strchr(char* str,char ch);
函数功能:找出str指向的字符串中第一次出现字符ch的位置
返回值:返回指向该位置的指针,如找不到,则返回空指针
使用例程:

int main()
{

    char dest[10]="abcd";
    char* rp;
    char ch= 'c';
    rp=strchr(dest, ch);
    if(NULL == rp)
        printf("no %c exist", ch);
    else
        printf("pos of %c is %d\n", ch, (int)(rp-dest+1));

    return 0;
}

结果:
在这里插入图片描述

7.strlen

函数原型:size_t strlen ( const char *s);
函数功能:计算字符串s的(unsigned int型)长度,不包括’\0’在内
返回值:s的长度,不包括’\0’在内
使用例程:

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

int main(void)
{
	int i=0;
	char *he = "Hello,world";
	i= strlen (he);
	printf ( "字符串长度为%d\n" ,i);
	return 0;
}

结果:
在这里插入图片描述

8.strcat

函数原型:char* strcat(char * str1,char * str2);
函数功能:把字符串str2接到str1后面,str1最后的’\0’被取消

使用例程:

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

int main(void)
{
    char dest[5]="abcd";
    char *src="123456";
    strcat(dest, src);
    printf("dest= %s\n", dest);

    return 0;
}

结果:
在这里插入图片描述

注意点:
1)确保str1的大小足够放下str2,否则会发生越界
2)str2会覆盖str1的末尾‘\0’
3)str2会从str1的第一个‘\0’开始覆盖
4)str2末尾需有’\0’
5)str2末尾的’\0’也会一同连接在str1后
6)该函数不一定是连接字符串,连接两个普通的数组(非字符串),也是可行的,但依然需符合上述注意点。

下面的例程验证(2) (3) (5)注意点:

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

int main(void)
{
	char str1[10] = { "abcdefghi" };
	char str2[10] = { "111" };
	int i = 0;
	str1[4] = 0;
	strcat(str1,str2);
	printf("str1=%s\r\n",str1);
	for (i = 0; i < 10; i++)
	{
		printf("%d ",str1[i]);
	}
	return 0;
}

结果:
在这里插入图片描述

9.strncat

函数原型:char *strncat(char *dest, const char *src, size_t maxlen)
函数功能:将字符串src中前maxlen个字符连接到dest中
使用例程:

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

int main()
{
    char dest[10]="abcd";
    char *src="123456";
    strncat(dest, src, 3);
    printf("dest= %s\n", dest);

    return 0;
}

结果:
在这里插入图片描述

10.memcpy

函数原型:void *memcpy(void *dest, const void *src, size_t n)
函数功能:内存拷贝
函数返回:指向dest的指针

使用例程:

#include<stdio.h>
#include<string.h>
int main()
{
  char src[]="******************************";
  char dest[]="abcdefghijlkmnopqrstuvwxyz0123456709";
  char *ptr=NULL;
  printf("destination before memcpy:%s\n",dest);
  ptr=memcpy(dest,src,strlen(src));
  if (ptr)
    printf("destination after memcpy:%s\n",dest);
  else
    printf("memcpy failed");
  return 0;
}

结果:
在这里插入图片描述

11.memset

函数原型:void *memset(void *s, int c, size_t n)
函数功能:字符串中的n个字节内容设置为c
函数返回:指向dest的指针

使用例程:

#include<stdio.h>
#include<string.h>
int main()
{
  char buffer[]="Hello world";
  printf("Buffer before memset:%s\n",buffer);
  memset(buffer,'*',strlen(buffer)-1);
  printf("Buffer after memset:%s\n",buffer);
  return 0;
}

结果:
在这里插入图片描述

12.memcmp

函数原型:int memcmp(const void *buf1, const void *buf2, size_t n);
函数功能:比较内存区域buf1和buf2的前n个字节。
函数返回:
如果返回值 < 0,则表示 str1 小于 str2。
如果返回值 > 0,则表示 str2 小于 str1。
如果返回值 = 0,则表示 str1 等于 str2。

#include<string.h>
#include<stdio.h>
int main()
{
	char *s1 = "Hello,Programmers!";
	char *s2 = "Hello,Programmers!";
	int r;
	r = memcmp(s1,s2,strlen(s1));
	if(!r)
	    printf("s1 and s2 are identical\n");/*s1等于s2*/
	elseif(r<0)
	    printf("s1 is less than s2\n");/*s1小于s2*/
	else
	    printf("s1 is greater than s2\n");/*s1大于s2*/
	return 0;
}

在这里插入图片描述

二、不常用函数

1.strnset

函数原型:char *strnset(char *s, int ch, size_t n)
函数功能:将字符串s中前n个字符设置为ch的值
返回值:指向s的指针
使用例程:

int main()
{
    char dest[10]="abcdabc";
    char* rp;
    char ch= 'F';
    rp=strnset(dest, ch, 4);
    printf("after strnset dest is %s \n", rp);

    return 0;
}

结果:
在这里插入图片描述

2.strset

函数原型:char *strset(char *s, int ch)
函数功能:将字符串s中所有字符设置为ch的值
返回值:指向s的指针
使用例程:

int main()
{
    char dest[10]="abcdabc";
    char* rp;
    char ch= 'F';
    rp=strset(dest, ch);
    printf("after strnset dest is %s \n", rp);
    printf("after strnset dest is %s \n", dest);
    return 0;
}

在这里插入图片描述

3.strtok

函数原型:char *strtok(char *s1, const char *s2)
函数功能:分解s1字符串,用特定分隔符(s2)分隔成多个字符串
返回值:字符串s1中首次出现s2中的字符前的子字符串指针
strtok()在参数s1的字符串中发现参数s2中包涵的分割字符时,则会将该字符改为’\0’字符。在第一次调用时,strtok()必需给予参数s1字符串,往后的调用则将参数s1设置成 NULL。每次调用成功则返回指向被分割出片段的指针。
使用例程:

int main()
{
    char dest[]="ab,cd,ef,c";
    char* rp;
    char ch[]= ",";
    rp=strtok(dest, ch);
    while(NULL != rp)
    {
        printf("dest: %s ", dest);
        printf("rp: %s \n", rp);
        rp=strtok(NULL, ch);
    }

    return 0;
}

在这里插入图片描述
例程提示:
dest:ab 只打印了ab后面就没打印了,是因为strtok(dest, ch); 使得dest数组内,ab后面的’,‘逗号被strtok函数换成了’\0’

说明:尽量使用可重入版的strtok,Windows平台下为strtok_s,Linux平台下为strtok_r。
牢记strtok函数族的分隔规则:忽略字符串前后的分隔符,连续的分隔符被当做一个处理。
在使用strtok前,请对源字符串进行备份,除非你可以接受字符串被修改这一事实(修改为分隔的第一个字符串)。

4.strupr

函数原型:char *strupr(char *s)
函数功能:将字符串s中的小写字母变为大写字母

使用例程:

int main()
{
    char dest[]="ab,cd,EF,c";
    char* rp;
    rp=strupr(dest);
    printf("dest: %s, rp: %s", dest, rp);

    return 0;
}

结果:
在这里插入图片描述
注:原字符串dest 也被修改!!,对符号和大写字符无影响。

5.strlwr

函数原型:char *strlwr(char *s)
函数功能:将字符串s中的大写字母变为小写字母
使用例程:

int main()
{
    char dest[]="ab,cd,EF,c";
    char* rp;
    rp=strlwr(dest);
    printf("dest: %s, rp: %s", dest, rp);

    return 0;
}

结果:
在这里插入图片描述

6.strrchr

函数原型:char *strrchr(const char *s, int c)
函数功能:得到字符串s中最后一个含有c字符的位置指针
返回值:位置指针

使用例程:

int main()
{
    char dest[10]="abcdabc";
    char* rp;
    char ch= 'c';
    rp=strrchr(dest, ch);
    if(NULL == rp)
        printf("no %c exist", ch);
    else
        printf("pos of %c is %d", ch, (int)(rp-dest+1));

    return 0;
}

结果:
在这里插入图片描述

7.strtol

函数原型:long strtol(char *str, char **endptr, int base);
函数功能:将串转换为长整型数
参数:
str是要转换的字符
enptr是指向第一个不可转换的字符位置的指针
base基数,范围从2至36,或特殊值0。
返回值:转换结果

注意点:
(1) 参数base代表采用的进制方式,如base值为10则采用10进制(字符串以10进制表示),若base值为16则采用16进制(字符串以16进制表示)。当base值为0时则默认采用10进制做转换,但遇到 ‘0x’ / ‘0X’ 前置字符则会使用 16 进制转换,遇到 ‘0’ 前置字符则会使用 8 进制转换。
(2) 若endptr 不为NULL,则会将遇到的不符合条件而终止的字符指针由 endptr 传回;若 endptr 为 NULL,则表示该参数无效,或不使用该参数。

函数执行流程:一开始strtol()会扫描参数str字符串,跳过前面的空格(只能跳空格,字母不行),直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时(’\0’)结束转换,并将结果返回。若参数endptr不为NULL,则会将遇到不合条件而终止的str中的字符指针由endptr返回;若参数endptr为NULL,则表示该参数无效,或不使用该参数。

示例1:

#include<stdlib.h>
#include<stdio.h>
int main(void)
{
	char*str1="87654321";
	char*str2="-87654321";
	char*str3="+87654321";
	char*endptr;
	long lnumber;
	
	lnumber=strtol(str1,&endptr,10);
	printf("str1=%s\nlong=%ld\n",str1,lnumber);
	
	lnumber=strtol(str2,&endptr,10);
	printf("str2=%s\nlong=%ld\n",str2,lnumber);
	
	lnumber=strtol(str3,&endptr,10);
	printf("str3=%s\nlong=%ld\n",str3,lnumber);
	return 0;
}

运行结果:
在这里插入图片描述
该示例注意点:
(1) strtol函数支持正负数的转换,可以在字符前加正负号也能顺利转换

示例2:

#include<stdlib.h>
#include<stdio.h>
void test1(void)
{
	char str[] = "  2030300 This is test";
	char *ptr;
	long ret;
	
	ret = strtol(str, &ptr, 10);
	printf("数字(无符号长整数)是 %ld\n", ret);
	printf("字符串部分是 |%s|\n", ptr);
}
void test2(void)
{
	char str[] = "abc2030300 This is test";
	char *ptr;
	long ret;
	
	ret = strtol(str, &ptr, 10);
	printf("数字(无符号长整数)是 %ld\n", ret);
	printf("字符串部分是 |%s|\n", ptr);
}
int main(void)
{
	test1();
	test2();
	return 0;
}

运行结果:
在这里插入图片描述
该示例注意点:
1、strtol函数能跳过参数str字符串前面的空格,但不能跳过字母等,若字符串第一个不是数字而是字母,strtol函数无法转换,且在endptr参数指针返回第一个不符合规则的字符。
2、若endptr 不为NULL,则会将遇到的不符合条件而终止的字符指针由 endptr 传回,如test1函数中,ptr最终指向2030300后面的空格,打印字符串部分的时候也把空格打出来了。
3、类似test2函数这种情况,传入的字符串一开始就是字母,strtol函数返回0。

示例3:
将字符串a, b, c 分别采用10, 2, 16进制转换成数字

#include <stdlib.h>
#include <stdio.h>
void main()
{
	char a[] = "100";
	char b[] = "100";
	char c[] = "ffff";
	printf("a = %d\n", strtol(a, NULL, 10)); //100
	printf("b = %d\n", strtol(b, NULL, 2)); //4
	printf("c = %d\n", strtol(c, NULL, 16)); //65535
}

运行结果:
在这里插入图片描述

8.strtod

函数原型:double strtod(char *str, char **endptr);
函数功能:将字符串转换为double型值
返回值:

示例:

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
	char* input="5.45",*endptr;
	double value;

	value=strtod(input,&endptr);
	printf("Thestringis%s\nthenumberis%lf\n",input,value);
	return 0;
}

结果:
在这里插入图片描述

9.strrev

函数原型: char *strrev(char *s)
函数功能: 将字符串中的所有字符颠倒次序排列
函数返回: 指向s的指针

示例:

#include<stdio.h>
#include<string.h>
int main(void)
{
  char forward[]="string";
  printf("Before strrev():%s\n",forward);
  strrev(forward);
  printf("After strrev():%s\n",forward);
  return 0;
}

在这里插入图片描述

10.待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吾爱技术圈

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

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

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

打赏作者

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

抵扣说明:

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

余额充值