c语言:字符串和内存函数介绍
字符串和内存函数:
目录
1、strlen(包含于头文件string.h)
2、strcpy(包含于头文件string.h)
3、 strcat(包含于头文件string.h)
4、strcmp(包含于头文件string.h)
5、strstr (包含于头文件string.h)
6、7、8、strncpy,strncat,strncmp (均包含于string.h中)
9、strtok
10、strerror
11、常见字符分类函数(islower,isupper,isdigit等)
12、字符转换函数(tolower以及toupper)
13、memcpy函数(memmove,memcpy的重叠用法)
14、memcmp
1、strlen(包含于头文件string.h)
- strlen是一种求字符串长度的函数,它的定义为
size_t strlen ( const char * str );
//引用头文件 string.h
- strlen的目标字符串以‘\0’作为结束标志,返回的则是'\0'之前出现的字符的个数(不包含'\0');
- 参数(目标字符串)必须以'\0'结尾,否则就会越界读取,返回一个错误值(随机值);
- strlen的返回类型为size_t类型(无符号类型)
- 举例:
#include<stdio.h>
#include<string.h>
int main()
{char arr[] = { "abcdefg" };//一共7个字符int ret = strlen(arr);printf("%d", ret);return 0;
}
- 模拟实现strlen函数:
#include<stdio.h> int my_strlen( char* arr) {char* end = arr;while(*end++ );return end - arr-1; } int main() {char arr[] = { "abcdefgh" };int len=my_strlen(arr);printf("%d", len);return 0; }
2、strcpy(包含于头文件string.h)
- strcpy是一种字符串拷贝的函数,它的定义为:
char* strcpy(char * destination, const char * source );
- strcpy将source指向的字符串拷贝到destination所指向的字符串当中;
- 源字符串必须以 '\0' 结束;
- 会将源字符串中的 '\0' 拷贝到目标空间;
- 目标空间必须足够大,以确保能存放源字符串。否则可能会造成缓冲溢出的情况;
- 目标空间必须可变。(目标空间如果不可修改则会程序崩溃)
- 举例
#include<stdio.h>
#include<string.h>
int main()
{char source[] = { "xxxx" };char destination[20] = { "abcdefgh" };strcpy(destination,source);printf("%s", destination);return 0;
}
- 模拟实现 :
#include <stdio.h> #include <string.h> #include <assert.h> char* my_strcpy(char* dest, const char* str) {assert(*dest != NULL);assert(*str != NULL);char* ret = dest;//拷贝str指向的字符串到dest指向的空间,包含'\0'while (*dest++ = *str++){;}//返回目的空间的起始地址return ret; } int main() {char arr1[] = "abcdefghi";char arr2[] = "bit";my_strcpy(arr1, arr2);printf("%s\n", arr1);printf("%s\n", arr2);return 0; }
3、 strcat(包含于头文件string.h)
- strcat函数定义为:
char * strcat ( char * destination, const char * source );
- 将source所指向的字符串追加到destination所指向的字符串后面(从destination中从左至右找到的第一个'\0'开始往后追加);
- 源字符串必须以 '\0' 结束。
- 目标空间必须有足够的大,能容纳下源字符串的内容。
- 目标空间必须可修改。
- 举例
#include<stdio.h> #include<string.h> int main() {char destination[20] = { "abcd" };char source[] = { "xxxx" };strcat(destination, source);return 0; }
- 模拟实现:(函数主体构建这里不再赘述)
char *my_strcat(char *dest, const char*src) {char *ret = dest;assert(dest != NULL);assert(src != NULL);while(*dest){dest++;}while((*dest++ = *src++)){;}return ret; }
4、strcmp(包含于头文件string.h)
- strcmp函数定义为:
int strcmp ( const char * str1, const char * str2 );
- strcmp将str2指向的字符串和str1指向的字符串从第一个开始逐个向后比较,并规定标准:
返回值对比
字符串大小 返回值 第一个字符串大于第二个字符串返回大于0的数字 第一个字符串等于第二个字符串返回0 第一个字符串小于第二个字符串返回小于0的数字 - 举例:例如字符串"abcd"
和 "abce" 由于'e'>'d',则第二个字符串>第一个字符串,返回小于0的数字
"abdd"
"abce" 由于'd'>'c',则第一个字符串>第二个字符串,返回大于0的数字 - 模拟strcmp函数:
#include<stdio.h>int my_strcmp(char* arr, char* crr) {while (*arr && *crr){if (*arr == *crr){arr++;crr++;}else if (*arr > *crr)return 1;else return -1;}if (*crr == '\0' && *arr == '\0')return 0;else if (*crr = '\0')return 1;elsereturn -1; } int main() {char arr[] = { "abce" };char crr[] = { "abce" };int ret = my_strcmp(arr, crr);printf("%d", ret);return 0; }
5、strstr (包含于头文件string.h)
- strstr函数定义为
char * strstr ( const char *str1, const char * str2);
- strstr用于找到str1所指向的字符串中第一次出现str2所指向的字符串的地址
- 举例:
#include<stdio.h> int main() { char arr[]={"abcdefabcdef"}; char brr[]={"bcd"}; char* p=strstr(arr,brr); return 0; }
- 模拟实现:
#include<stdio.h> char* my_strstr( char* str1, char* str2) {if (*str2 == '\0')return str1;while (*str1){ char* p = str1;char* crr = str2;while (*crr == *p){p++;crr++;}if (*crr == '\0')return str1;str1++;}return (NULL); } int main() {char arr[] = { "abcdefbbcdef" };char crr[] = { "cde" };char* p = my_strstr(arr, crr);printf("%c", *p);return 0; }
6、7、8、strncpy,strncat,strncmp(均包含于string.h中)
区别于strcpy,strcat,strcmp,他们之间多了一个n,这个n就用于固定要访问的字符串长度。
在不讨论返回值的情况下,他们都有一个固定的格式
strn ***(char*destination,char*source,int n)
- strncpy,固定从source所指向的字符串当中拷贝从第一个字符开始,长度为n的字符串到destination所指向的字符串当中。
- strncat,将source所指向的字符串的前n个字符追加到destination所指向的字符串当中(覆盖掉destination指向的字符串末尾的
'\0')。如果n大于字符串长度,则会追加全部字符。
- strncmp,比较两个字符串的前n个字符,比较方法不变。
9、strtok
strtok 函数定义
char * strtok ( char * str, const char * sep );
- sep所指向的字符串,定义了在str中当作分割符的字符集合,strtok函数通过sep找到str中的分隔符,将其标记并改为
'\0',然后返回这个标记的指针。(strtok函数会改变str所指向的字符串,所以参数一般都是目标字符串的临时拷贝) - strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置
- strtok函数第一参数若为空指针,函数将在同一个字符串中被保存的位置开始,查找下一个分隔符并标记返回该标记所指向的下一个元素的指针。
- 举例:
#include<stdio.h> #include<string.h> int main() {char arr[] = { "xx?abc{ddf+ll" };char* p = arr;char sep[] = { "?{+" };char*ret=strtok(p, sep);printf("%s\n", ret);ret = strtok(NULL, sep);printf("%s\n", ret);ret = strtok(NULL, sep);printf("%s\n", ret);return 0; }
结果可见,strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。如果找不到,则返回空NULL指针。(如果这里第四次调用,已经被分割完,则会返回空指针)。
10、strerror
- 返回错误码,所对应的错误信息(必须包含头文件string.h,stdio.h,与errno.h)
- strerror函数定义为
errnum为错误码,不同的错误码对应着不同的错误信息;当错误信息生成的时候就会被保存在errnum当中,识别errnum当中的错误码信息就可以查找解决对应的问题。char * strerror ( int errnum );
- 演示:
#include<errno.h> #include<string.h> #include<stdio.h> int main() { printf("%s\n",strerror(0)); printf("%s\n",strerror(1)); printf("%s\n",strerror(2)); printf("%s\n",strerror(3)); printf("%s\n",strerror(4)); return 0; }
11、常见字符分类函数(islower,isupper,isdigit等)
- 举例,就拿isdigit函数来说,此类函数包含于头文件ctype.h中;当判断为是数字字符时,isdigit函数返回非0的数字,当判断为非数字字符的时候,返回数字0;
#include<stdio.h> #include<ctype.h> int main() {char ch = 'a';int flag = isdigit(ch);if (flag)printf("YES\n");elseprintf("NO\n"); //打印结果为NO;return 0; }
一些其他的分类函数(表格);返回值和类型与上述相当;
isdigit | 判断是否为0~9的十进制数字 |
isxdigit | 判断是否为十六进制(包含十进制和大小写字母) |
islower | 判断是否为小写字母 |
isupper | 判断是否为大写字母 |
isalpha | 判断是否为大小写字母 |
isalnum | 判断是否为字母或者数字 |
ispunct | 判断是否为标点符号已经任何数字或字母的图形字符 |
isgraph | 判断是否为任何图形字符 |
isprint | 判断是否为任何可打印字符(包括图形和空白字符) |
12、字符转换函数(tolower以及toupper)
函数定义为:
int tolower ( int c ); int toupper ( int c );
- 使用:(此处将返回值改为大写,并未转变原字符串)
#include <stdio.h> #include <ctype.h> int main () {int i=0;char str[]="abcdef ABCDEF.\n";char c;while (str[i]){c=str[i];if (isupper(c)) c=tolower(c);putchar (c);i++;}return 0; }
13、memcpy函数(memmove,memcpy的重叠用法)
- 函数定义为:
void * memcpy ( void * destination, const void * source, size_t num );
- 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
- 这个函数在遇到 '\0' 的时候并不会停下来。
- 如果source和destination有任何的重叠,复制的结果都是未定义的。
- 举例:(其他类型的数据同样如此)
#include<stdio.h> #include<string.h> int main() {int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int brr[10] = {0};memcpy(brr, arr, 20);//这里将arr的前五个元素拷贝到brr中;for (int i = 0;i < 10;i++)printf("%d ", brr[i]);return 0; }
- 模拟实现memcpy(同时也是memmove的实现):
#include<stdio.h>void* my_memcpy(void *dest, void *str, size_t n) {void* ret = dest;if (dest < str){while (n--){*(char*)dest = *(char*)str;dest = (char*)dest + 1;str = (char*)str + 1;}}else{while (n--){*((char*)dest + n) = *((char*)str + n);}}return ret; }int main() {int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int brr[5] = { 0 };my_memcpy(arr+2, arr, 20);for (int i = 0;i < 10;i++){printf("%d ", arr[i]);}return 0; }
14、memcmp
- memcmp函数定义 :
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
- 类似于strcmp,这里num来控制两个字符串比较的长度(单位字节),返回值类似于strcmp。
str1 ? str2 返回值 > >0 < <0 = =0 - 举例:
#include<stdio.h> #include<string.h> int main() {int str1[] = { 1,2,3,4,5,6,7 };int str2[] = { 1,2,3,4,7,6,6 };int ret= memcmp(str1, str2,20 );if (ret > 0)printf("str1>str2\n");else if (ret < 0)printf("str1<str2\n");elseprintf("str1=str2\n");return 0; } //运行结果为 str1 < str2
c语言:字符串和内存函数介绍相关推荐
- 【C语言】字符串和内存函数介绍及模拟实现
- c语言数字转化为字母表,c语言字符串 数字转换函数大全
转载:c语言字符串 数字转换函数大全 字符串数字转换到底什么意思呢: 字符串和数字的编码不一样,字符串是按照国际标准ASCII码表进行编码,每个数字都是一个8位的ASCII码(也就是一个字节大小):而 ...
- C语言程序设计 | 动态内存管理:动态内存函数介绍,常见的动态内存错误,柔性数组
动态内存管理目录: 动态内存函数的介绍 常见的动态内存函数的错误 柔性数组 为什么会有动态内存管理呢 我们在日常使用中,创建一个数组,一个变量时都会开辟空间 如: int a; //在栈上开辟一个四字 ...
- 【C语言】一组内存函数——memory
hello~~,我是~小鹿,这是我的第二篇博客,算是接着上一篇的字符串函数写的吧,这一篇讲的是内存函数,能够直接操作内存,内存函数不需要知道被操作的内容类型,只需要告知内存即可. 有什么不对的地方希望 ...
- libpcap c语言,libpcap库主要函数介绍
libpcap是一个C语言库,libpcap的英文意思是 Packet Capture library,即数据包捕获函数库,其功能是通过网卡抓取网络以太网中的数据包.这个库为不同的平台提供了一致的c函 ...
- C语言 字符串相关的函数
字符串相关的函数 bcmp bcopy bzero memccpy memchr memcmp memcpy memicmp memmove memset movmem setmem stpcpy s ...
- 7、C语言 —— 字符串常用处理函数
为什么80%的码农都做不了架构师?>>> 一.字符处理函数 1.字符输出函数putchar putchar(65);// 或 putchar('A');// 或 int a = ...
- 【C语言】字符串和内存函数详解
文章目录 1. 求字符串长度 strlen
- c语言字符串字节数函数,C语言字符,字符串,字节操作常用函数
strlen 这个函数是在 string.h 的头文件中定义的 它的函数原型是 size_t strlen( const char ); size_t 是一个无符号整型,是这样定义的 typedef ...
最新文章
- Fiddler代理手机抓包
- 测试dali协议的软件,基于DALI协议的数字照明控制软件的研发
- free mybatis 不生效_2019BATJ面试题汇总详解:MyBatis+MySQL+Spring+Redis+多线程
- Python笔记-函数装饰器
- 经典查找算法及其Python实现
- linux常用查看磁盘空间大小的命令
- android ui设计最新字体,UI设计常用字体规范
- Mysql数据库手册
- Maven 中 com.adobe.blazeds 的配置失效解决方案
- windows安装hbase
- 【React】第八部分 react脚手架安装以及react脚手架配置代理
- bzoj5369: [Pkusc2018]最大前缀和 状压Dp 计数Dp
- 计算机进化阶段,进化计算
- (附源码)springboot火车票订票系统 毕业设计 171538
- 蔡松龙---小白羊餐饮
- 2022.04.04树莓派最新镜像问题,树莓派如何设置初始化的账户和密码
- 接近618,浅谈“猫爪杯”,“优衣库”背后的饥饿营销套路
- 新手怎么租用传奇服务器
- ILRuntime篇:前言
- TITAN Haptics推出捆绑了Immersion许可的下一代触觉马达
热门文章
- 鲁鹏老师三维重建课程之单视图重建
- Java使用POI导出Word文档
- cts游戏手机版_cts游戏手机版ios
- 【Linux】调试常见的应用程序奔溃“Segmentation fault (core dumped)”
- 【二分】NEERC15 L Landscape Improved(2015-2016 ACM-ICPC)(Codeforces GYM 100851)
- A micro Lie theory for state estimation in robotics001
- 在uniapp使用日历组件的实现
- win64 IDEA meaven 配置安装Thrift自动生成代码到目录
- Python数据科学库(三)
- RAID(阵列)恢复为普通硬盘