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

目录

  • 一、常用函数
    • 1.strcpy
    • 2.strncpy
    • 3.strstr
    • 4.strcmp
    • 5.strncmp
    • 6.strchr
    • 7.strlen
    • 8.strcat
    • 9.strncat
    • 10.memcpy
    • 11.memset
    • 12.memcmp
  • 二、不常用函数
    • 1.strnset
    • 2.strset
    • 3.strtok
    • 4.strupr
    • 5.strlwr
    • 6.strrchr
    • 7.strtol
    • 8.strtod
    • 9.strrev
    • 10.待续

一、常用函数

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);elseprintf("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);elseprintf("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*/elseprintf("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);elseprintf("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)); //100printf("b = %d\n", strtol(b, NULL, 2)); //4printf("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.待续

C语言string.h文件函数汇总详解相关推荐

  1. C语言 -- string.h中函数功能详解与手动实现 - 02(常用函数memcpy、memmove、strcpy、strdup、strcat、strtok...)

    内容预览 3.5.搬迁类型 --- 函数功能详细说明 :将内存空间中内容移动.复制到另一内存空间 3.6.搬迁类型 --- 函数功能测试与手动实现 3.6.1.memcpy.memccpy 3.6.2 ...

  2. c语言fputc输入字符串,C语言fgetc和fputc函数用法详解(以字符形式读写文件)

    C语言fgetc和fputc函数用法详解(以字符形式读写文件),文件,字符,指针,函数,字节 C语言fgetc和fputc函数用法详解(以字符形式读写文件) 易采站长站,站长之家为您整理了C语言fge ...

  3. 计算机科学类专升本复习之“C语言fgetc和fputc函数用法”详解(初稿)

    C语言fgetc和fputc函数用法详解(以字符形式读写文件) 在C语言中,"读写"文件比较灵活,既可以每次"读写一个字符",也可以"读写一个字符串& ...

  4. R语言tidyr包gather()函数实战详解:数据收缩、从宽表到窄表

    R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 目录 R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 收缩两列数据

  5. R语言tidyr包spread()函数实战详解:数据裂变、从窄表到宽表

    R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表 目录 R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表

  6. R语言tidyr包Unite()函数实战详解:多个数据列合并为一列

    R语言tidyr包Unite()函数实战详解:多个数据列合并为一列 目录 R语言tidyr包Unite()函数实战详解:多个数据列合并为一列

  7. R语言tidyr包separate()函数实战详解:一列裂变为多列

    R语言tidyr包separate()函数实战详解:一列裂变为多列 目录 R语言tidyr包separate()函数实战详解:一列裂变为多列 一列裂变为两列

  8. C语言常用字符串操作函数大全详解(strstr,strtok,strrchr,strcat,strcmp,strcpy,strerror,strspn,strchr等)

    参考:string.h中常用字符串操作函数说明(strstr,strtok,strrchr,strcat,strcmp,strcpy,strerror,strspn,strchr等) 作者:一只青木呀 ...

  9. c++ memset 语言_C++中memset函数用法详解

    本文实例讲述了C++中memset函数用法.分享给大家供大家参考,具体如下: 功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常 ...

最新文章

  1. 虚拟化基础架构Windows 2008篇之1-虚拟化基础服务概述
  2. Event 系列: jquery event 源码
  3. stdthread(7)并发unique_lock灵活性
  4. 窗口捕获显示黑屏_win10每次重启黑屏假死
  5. linux pid t 头文件_pid和tid及线程调度
  6. Uncompilable source code in netbeans
  7. c#用控制台程序安装启动停止卸载服务
  8. 李开复说明年有一批AI创企会倒闭,不想死的创业公司需要警惕什么?
  9. github使用指南_GitHub 上的 12 个骚操作
  10. 如何用EasyRecovery找回回收站信息(附注册机下载地址)
  11. 制作纯净系统U盘教程(详细版)
  12. 图文并解Word插入修改删除批注
  13. tensorflow的数据类型
  14. RuntimeError: a view of a leaf Variable that requires grad is being used in an in-place operation.
  15. linux将目录路径加入环境变量中,如何添加路径到PATH环境变量
  16. 零基础如何入门编程开发?
  17. 计算机毕业设计之二手书交易系统
  18. registration 计算机视觉
  19. Python 邮件发送之嵌套图片发送附件
  20. Linux下编译so文件

热门文章

  1. Google Duo采用WaveNetEQ填补语音间隙
  2. 技术人凭什么那么骄傲?谢然:给自己开发工具
  3. Hadoop之DataNode工作机制
  4. 这一次,腾讯用AI让手语“发声”
  5. nginx源码分析configure脚本详解
  6. linux文件创建、查看、编辑命令
  7. IM的扫码登录功能如何实现?一文搞懂主流的扫码登录技术原理
  8. 根据这博客复习,我收到了BAT等大厂的技术岗offer
  9. 爬虫 spider11——搭建分布式架构通过feign技术,开发服务消费者
  10. leetcode 1239. Maximum Length of a Concatenated String with Unique Characters | 1239. 串联字符串的最大长度(回溯)