字符函数和字符串函数(函数介绍)
目录
1.strlen
2.strcpy
3.strcat
4.strcmp
5.strncpy
6.strncat
7.strncmp
8.strstr
9.strtok
10.strerror
11.memcpy
12.memmove
13.memcmp
1.strlen
该函数是求有效字符串的长度(不包括'\0'),其返回值是无符号整数
typedef unsigned int size_t;
size_t strlen(const char* str);
#include<stdio.h>
int main()
{const char* str1 = "abcdef";const char* str2 = "nbb";//if(strlen(str2)>strlen(str1)) 比较字符串的大小if (strlen(str2) - strlen(str1) > 0)//发生隐式转化//无符号整数 -3会被转化成为巨大的无符号整数{printf("str2>str1\n");//√}else{printf("str2<str1\n");}return 0;
}
2.strcpy
该函数是进行字符串的拷贝,开辟空间时需要容纳'\0',使用所有的字符串函数都需要引入#include<string.h>
char* strcpy(char* destinztion,const char* cource);
#include<stdio.h>
#include<string.h>
int main()
{const char* src = "abcd";char dst[8];strcpy(dst, src);//把src拷贝给dstprintf("%s\n",dst);return 0;
}
3.strcat
该函数是进行字符串的拼接(追加拷贝)
char* strcat(char* destinztion,const char* cource);
#include<stdio.h>
#include<string.h>
int main()
{const char* src = "abcd";char dst[16] = "feg";strcat(dst, src);//在dst后面拼接srcprintf("%s\n", dst);return 0;
}
注:(1)拼接也是拷贝
(2)需要dst预留足够大的空间,可以容纳拷贝内容
4.strcmp
该函数是进行字符串比较
int strcmp(const char* str1,const char* str2);
#include<stdio.h>
#include<string.h>
int main()
{const char* str1 = "abcd75";const char *str2 = "abcd";int ret = strcmp(str1, str2);// str1 > str2, ret > 0; str1 < str2, ret < 0; //str1 = str2, ret = 0;printf("%d\n", ret);return 0;
}
比较规则:从左向右,只要特定的字符不相等,哪个字符大,所在的字符串就大,长短无关,用阿斯克码值比较的
5.strncpy
该函数是进行指定个数的拷贝,默认不带'\0',是安全的接口
字符串的“安全”,不是不崩溃,也不是不报错,是接口是安全的,是想表明如果报错了,和我接口没有关系(总之,接口无责,影响可控)
char* strncpy(char* destination,const char* source,size_t num);
#include<stdio.h>
#include<string.h>
int main()
{const char* src = "abcd";char dst[8];strncpy(dst, src, strlen(src) + 1);printf("%s\n",dst);return 0;
}
6.strncat
该函数是实现指定个数的拼接(自己给自己拼接是不可以的)
char* strncat(char* destination,const char* source,size_t num);
#include<stdio.h>
#include<string.h>
int main()
{const char* src = "abcd";char dst[16] = "feg";strncat(dst, src,3);//拼接完整的将3改为strlen(src)+1printf("%s\n", dst);return 0;
}
7.strncmp
该函数是进行指定字符数的比较
int strncmp(const char* str1,const char* str2,size_t num)
#include<stdio.h>
#include<string.h>
int main()
{const char* str1 = "abcd75";const char* str2 = "abcd";int ret = strncmp(str1, str2,6);printf("%d\n", ret);return 0;
}
puts():往显示器上打印字符串,不作处理
8.strstr
该函数是进行子串查找
char* strstr(const char* str1,const char* str2);
#include<stdio.h>
#include<string.h>
int main()
{//char* strstr(const char* target,const char* sub_str);const char* target = "abc123defi123xyz";const char* sub_str = "123";char* found = strstr(target, sub_str);found++;//printf("%s\n", strstr(found, sub_str));//在target中找sub_str第二次出现printf("%s\n", found);//在target中找sub_str第一次出现
}
9.strtok
该函数是字符串的切分,用分隔符进行切分,需要多次调用,才能彻底完成切分(返回值!=NULL,NULL就结束截取)
C中一般只有一个返回值
char* strtok(char* str,const char*sep)
// 切分的字符串 分隔符(可以指定多个)
#include<stdio.h>
#include<string.h>
int main()
{char str[] = "hello,world|hello world";char* sub1 = strtok(str, ",|");printf("%s\n", sub1);//hello//如果截取剩下的字符串需要第二次之后,调用的时候,str -> NULLchar* sub2 = strtok(NULL, ",|");printf("%s\n", sub2);//hello//world//第二次之后,函数是由于strtok中定义有类似于static类型的变量,故能记得老的字符串
}
原理:(1)strtok一定有类似于全局或者static类型的char*变量,保存历史剩余字符串,用来进行后续截取
(2)通过设置目标串中的分隔符->\0 的方式,进行子串切割
#include<stdio.h>
#include<string.h>
int main()
{char str[] = "hello,world|hello world";char* sub = strtok(str, ",|");while (sub != NULL){printf("sub_string:%s\n", sub);sub = strtok(NULL, ",| ");}
}
补充:(1)有连续的分隔符(全部忽略)
(2)切了一部分,想切新的字符串直接传入就好了
(3)要分割的字符串,必须是可写的(可修改的)
10.strerror
该函数是错误控制的函数
与库函数相关的,C中,有一个全局变量,errno,用来记录库函数调用的时候,出错了,是因为什么原因出错
将错误码->错误码描述
char* strerror(int errnum);
#include<stdio.h>
#include<string.h>
int main()
{for (int i = 0; i < 50; i++){printf("%d:%s\n", i, strerror(i));}
}
字符分类函数:
#include<stdio.h>
#include<string.h>
#include<ctype.h>//字符分类函数需要引入
int main()
{char a = ' ';if (isspace(a))//判断:空格' '; 换页'\f'; 换行'\n'; 回车'\r';{printf("yes!\n");}char b = '1';if (isdigit(b))//判断十进制数字 '0'-> '9'{printf("yes!\n");} char c = 'a';printf("%c\n", toupper(c));//小写转大写char d = 'A';printf("%c\n", tolower(d));//大写转小写return 0;
}
#include<stdio.h>
#include<string.h>
#include<ctype.h>//字符分类函数需要引入
int main()
{char* str = "aAbBcCdD";char big[10];char small[10];char* start = str;int i = 0;int j = 0;while (*start != '\0'){if (islower(*start)){small[i++] = *start;//将小写字母保存到small[]}else if (isupper(*start)){big[j++] = *start;printf("%c ", big[i]);//将大写字母保存到big[]}else{}start++;}return 0;
}
11.memcpy
该函数是内存操作函数(以mem开头的函数)(凌驾于一切操作函数之上),没有类型,只有内存空间
#include<stdio.h>
#include<string.h>
int main()
{const char* src = "hello world";char dst[16];memcpy(dst, src, strlen(src) + 1);//完成字符串拷贝printf("%s\n", dst);
}
#include<stdio.h>
#include<string.h>
struct stu
{char name[16];int age;
};
int main()
{struct stu zhangsan = { "张三",18 };struct stu lisi;memcpy(&lisi, &zhangsan, sizeof(zhangsan));//结构体的拷贝printf("%s %d\n", lisi.name,lisi.age);
}
12.memmove
该函数约等于memcpy,也是内存操作函数
memcpy函数和memmove的区别:可能有老的版本的书和编译器会有内存重叠的问题,memmove能处理,而memcpy处理不了,但是新的编译器已经完全能处理了
13.memcmp
该函数是比较字符串、数组等等
#include<stdio.h>
#include<string.h>
int main()
{char buffer1[] = "DWgaOtP12df0";char buffer2[] = "DWGAOTP12DF0";int n;n = memcmp(buffer1, buffer2, sizeof(buffer1));if (n > 0){printf("'%s' is greater than '%s'.\n", buffer1, buffer2);//√}else if (n < 0){printf("'%s' is less than '%s'.\n", buffer1, buffer2);}else{printf("'%s' is the same as '%s'.\n", buffer1, buffer2);}return 0;
}
字符函数和字符串函数(函数介绍)相关推荐
- oracle关于字符串函数,Oracle字符串处理函数
Oracle字符串处理函数 Oracle字符串处理函数 2008年10月18日 星期六 23:45 项目中有涉及存储过程对字符串的处理,所以就将在网上查找到的资料汇总,做一个信息拼接式的总结. 以下信 ...
- 199 c 通过函数名字符串调用函数
通过函数名字符串调用函数 今天写c的作业时候想起来能不能用函数名字符串来调用函数 一.函数指针 第一个问题,函数名如何保存,我们需要用到函数指针 声明 type (*func)(type &, ...
- 函数调用通过函数名字符串调用函数【C语言版】
在写这篇文章之前,xxx已经写过了几篇关于改函数调用主题的文章,想要了解的朋友可以去翻一下之前的文章 问题引入 在C中,函数先定义,后使用.举个简单的例子 /********************* ...
- 通过函数名字符串调用函数【C语言版】
问题引入 在C中,函数先定义,后使用.举个简单的例子 /************************ * add by oscar999 ************************/ fun ...
- 不使用函数实现字符串拼接函数strcat
不使用函数实现字符串拼接函数strcat,已知函数原型为 char *strcat(char *dest,const char src); 不使用系统库函数,实现strcat #include< ...
- c语言 怎么将字符串代入函数,通过函数名字符串调用函数【C语言版】
问题引入 在C中,函数先定义,后使用.举个简单的例子 /************************ * add by oscar999 ************************/ fun ...
- Excel怎样从一串字符中的某个指定“字符”前后截取字符及截取字符串常用函数
原始字符串: 品种在源系统主键(id) 截取前面的 (品种在源系统主键): =LEFT(B3,FIND("(",B3)-1) 截取后面的 (id): =LEFT(RIG ...
- Excel怎样从一串字符中的某个指定“字符”前后截取字符及截取字符串常用函数...
怎么样可以从一串字符中的某个指定位置的前或后截取指定个数的字符. 如:12345.6789,我要截取小数点前(或后)的3个字符.怎么样操作, 另外,怎么样从右边截取字符,就是和left()函数相反的那 ...
- 字符数组与字符串处理函数
C语言中没有字符串类型,也没有字符串变量,字符串是存放在字符类型数组中的. 定义.初始化.引用字符数组 1.定义:用字符数组来存放字符数据,在字符数组中的一个元素内存放一个字符.定义方法与定义数值型数 ...
- split函数python_Python字符串split函数知多少【Python每日一个知识点第75期】
Python字符串操作是一名开发人员的基本功,求职面试往往也会通过字符串相关考题来考验开发者对于语言基础的掌握.Python字符串的分割操作更是考察重点,能否灵活运用split被视为开发人员对于Pyt ...
最新文章
- JAVA框架Struts2 Action类
- 左神算法:用递归函数和栈逆序一个栈(Java版)
- React Native 和ionic2 你选择哪一个?
- 平安城市与智慧城市对接的关键要素
- 计算机基础:多媒体基础知识笔记
- mysql+linux+无法启动服务无法启动不了_Linux实例中MySQL服务常见的无法启动或启动异常处理...
- python运维开发培训_运维架构师-Python 自动化运维开发-014
- 推荐几个2021年在Redis、Go和Rust领域异军突起的技术公众号
- 2013年11月17日
- 服务器端添加网站,服务器添加网站
- si4438使用stm32f103配置调试成功!
- 汇川技术小型PLC梯形图编程系列教程(1)小型PLC型号H123U简介
- opencv python 的基本操作案例(一) 记录,可查看
- Jenkins下载安装及配置
- 【论文翻译】Class-Incremental Few-Shot Object Detection
- 屏蔽不讲robots规则的国外垃圾蜘蛛
- win11怎么关闭自动更新系统
- 如何给学生选择好的台灯?分享国AA级照度的护眼台灯
- 【Linux-Windows】猫、路由器、交换机
- 【接口篇 / Wan】(7.0) ❀ 02. 配置路由器上网 ❀ FortiGate 防火墙