首页 > 其他分享 >关于字符串的功能函数小结

关于字符串的功能函数小结

时间:2024-05-25 14:06:51浏览次数:22  
标签:const 函数 str1 char strsep printf 字符串 小结

笔者做项目过程中,使用了很多关于字符串的C库中自带功能函数,极大便利了项目流程。再次做一个小结,之后若有增加会继续补充。

所需采用函数

序号 函数/描述
1 char *strcat(char *dest, const char *src) 【char *strncat(char *dest, const char *src, size_t n)】
功能:连接两个字符串【连接至多n个字节的字符串】
dest目标字符串,src源字符串
返回值:返回目标字符串dest的指针
用法详见例1
2 int strcmp(const char *s1, const char *s2)【int strncmp(const char *s1, const char *s2, size_t n)】
功能:比较两个字符串【比较至多n个字节的字符】
s1目标字符串,s2源字符串,n 字节数量
返回值:如果分别发现s1(或其前n个字节)小于、等于或大于s2,则返回一个小于、等于或大于零的整数。
用法详见例2
3 char *strcpy(char *dest, const char *src)【char *strncpy(char *dest, const char *src, size_t n)】;
功能:复制两个字符串【复制至多n个字节的字符】
dest目标字符串,src源字符串
返回值:返回目标字符串dest的指针
用法详见例3
4 char *strstr(const char *haystack, const char *needle)【char *strchr(const char *s, int c); char *strrchr(const char *s, int c);】;
功能:定位字符串中的子串【定位字符串的字符】
haystack目标字符串,needle子串指针
返回值:strstr函数返回指向找到的子字符串开头的指针,如果找不到子字符串,则返回NULL。【strchr返回指向首次找到字符c的字符开头的指针; strrchr返回指向最后依次找到字符c的字符开头的指针;】
5 char *strtok(char *str, const char *delim);【char *strtok_r(char *str, const char *delim, char **saveptr)】;
功能:从字符串中提取令牌(此处的令牌可理解为每个被分割的子串)
在第一次调用时,str是一个指向要分割的字符串的指针。在后续的调用中,它应该为 NULL,因为 strtok() 会内部保存上次调用时的位置。
delim指向一个字符串的指针,该字符串包含了用于分隔 str 的所有字符。
str目标字符串,delim一个包含分隔符的字符串。strtok 会根据这个字符串的每一个分隔符来分割 str
使用 strtok()strtok_r() 后,原始字符串 str 会被修改,因为这两个函数会在找到的每个令牌后插入一个空字符('\0')来终止它。
返回值:每次都会返回'\0'前面的值。
用法详见例4
6 char *strerror(int errnum);
功能:这个函数接受一个错误号作为参数,并返回一个指向描述该错误的字符串的指针。
(用的比较少,后面再补充用法与perror有相同之处)
7 int atoi(const char *nptr);【 long atol(const char *nptr)】【long long atoll(const char *nptr)】;
功能:把字符串转为整型(长整型/长长整型),从字符串的开头开始解析整数,直到遇到非数字字符为止。
用法详例5
8 double strtod(const char *nptr, char **endptr);【float strtof(const char *nptr, char **endptr)】;
功能:把字符串转为浮点型
nptr 所指向的字符串用法详例子;endptr 会被设置为指向在 nptr 中首次出现不能转换为数字的字符的指针。
9 size_t strlen(const char *s);【size_t strnlen(const char *s, size_t maxlen);】
功能:计算字符串长度【strnlen() 函数只会查看从 s 指向的字符串开始的最多 maxlen 个字符。】
10 char *strsep(char **stringp, const char *delim)
功能:功能与strtok类似,有几点区别:
(1)strtok是C标准库中的一个函数,它在POSIX标准中也有定义。这意味着它在各种C和C++编译器中都可用,并且其行为是标准化的。然而,strsep并不是C标准或POSIX标准的一部分,而是GNU C库(glibc)中的一个函数,起源于BSD。
(2)线程安全性。
(3) strsep参数不能用NULL
strsep和strtok在功能上是相似的,但在标准化程度、线程安全性、连续分隔符的处理、返回值和参数类型等方面存在差异,需要更深一步学习
用法详见例4

例1:strcat&strncat

#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{

	char str1[100] = "Hello";//此处一定要申请一个足够空间的变量,存放str2
	char *str2 = "world";
	strcat(str1, str2);
	printf("change str1 for [%s]\n", str1);

	strncat(str1, str2, 4);
	printf("change str1 for [%s]\n", str1);

	return 0;
}
//输出结果
change str1 for [Helloworld]
change str1 for [Helloworldworl]

例2:strcmp

int main(int argc, char const *argv[])
{

	char str1[100] = "Hello";
	char *str11 = "Hello";
	char *str2 = "Hell";
	char *str3 = "Hello";
	char *str4 = "Hello1";
	printf("result of compare str1 and str2:%d \n", strcmp(str1, str2));
	printf("result of compare str11 and str2:%d \n", strcmp(str11, str2));
	printf("result of compare str1 and str3:%d \n", strcmp(str1, str3));
	printf("result of compare str11 and str3:%d \n", strcmp(str11, str3));
	printf("result of compare str1 and str4:%d \n", strcmp(str1, str4));
	printf("result of compare str11 and str4:%d \n", strcmp(str11, str4));
	return 0;
}
//输出结果
result of compare str1 and str2:111
result of compare str11 and str2:111
    //得出结论,数组和字符串常量指针可以直接比较
    //str1大于str2,输出大于0,str1等于于str3,输出0,str1小于str4,小于0,
result of compare str1 and str3:0
result of compare str11 and str3:0
result of compare str1 and str4:-49
result of compare str11 and str4:-49

例3:strcpy&strncpy

int main()
{
	char str1[100] = "Hello the world";//此处一定要申请一个足够空间的变量,存放str2
	char *str2 = "world";
	char str11[100] = "Hello the world";//此处一定要申请一个足够空间的变量,存放str2
	char *str22 = "world";
	strcpy(str1, str2);
	printf("copy str1 for [%s]\n", str1);
	strncpy(str11, str22, 4);
	printf("ncopy str1 for [%s]\n", str11);
	return 0;
}
//输出结果 
//得到结论,strcpy复制整个源字符串并且会自动添加\0,
//但strncpy不会自动添加\0,如果str1长度大于str2,则只会替换前n个字符,后面的照常
copy str1 for [world]
ncopy str1 for [worlo the world]

例4:strtok&strsep

int main()
{

	char student_info[100] = "姓名:李四|性别:男|电话号码:123456789|身份证号码:987654321"; // 以':'和'|'为分隔符分割信息
	char *tmp = NULL;
	tmp = strtok(student_info, ":"); // 得到第一个“令牌”,即将遇到的第一个‘:’变成‘\0’,tmp得到的是 “姓名”
	int i = 1;
	while (tmp != NULL)
	{
		printf("遇到的第%d次分隔符分割结果:%s\n", i, tmp);
		i++;
		tmp = strtok(NULL, ":|"); // // 得到后续“令牌”,即将遇到的后续的‘:’或者‘|’都改成‘\0’,并返回前值。
	}
	printf("student_info变成:%s\n", student_info); // 原始的字符串会被改变,被第一次使用的分隔符分割,后面的被‘\0’隔断

	char student_info2[100] = "姓名:李四|性别:男|电话号码:123456789|身份证号码:987654321"; // 以':'和'|'为分隔符分割信息
	char *tmp2 = NULL;
	char *strsep_test = student_info2;
	tmp2 = strsep(&strsep_test, ":"); // 得到第一个“令牌”,即将遇到的第一个‘:’变成‘\0’,tmp得到的是 “姓名”
	i = 1;
	while (tmp2 != NULL)
	{
		printf("strsep第%d次分割结果:%s\n", i, tmp2);
		i++;
		tmp2 = strsep(&strsep_test, ":|"); // // 得到后续“令牌”,即将遇到的后续的‘:’或者‘|’都改成‘\0’,并返回前值。
	}
	printf("student_info变成:%s\n", student_info2); // 原始的字符串会被改变,被第一次使用的分隔符分割,后面的被‘\0’隔断

	return 0;
}

//输出结果
遇到的第1次分隔符分割结果:姓名
遇到的第2次分隔符分割结果:李四
遇到的第3次分隔符分割结果:性别
遇到的第4次分隔符分割结果:男
遇到的第5次分隔符分割结果:电话号码
遇到的第6次分隔符分割结果:123456789
遇到的第7次分隔符分割结果:身份证号码
遇到的第8次分隔符分割结果:987654321
student_info变成:姓名
strsep第1次分割结果:姓名
strsep第2次分割结果:李四
strsep第3次分割结果:性别
strsep第4次分割结果:男
strsep第5次分割结果:电话号码
strsep第6次分割结果:123456789
strsep第7次分割结果:身份证号码
strsep第8次分割结果:987654321
student_info变成:姓名

例5:atoi, atol, atoll,strtod, strtof

int main()
{
	char *str = "123hello";

	printf("%d %ld %lld\n", atoi(str), atol(str), atoll(str)); // 遇到非数字就停止,因此输出123
	char *str1 = "123.456hello";
	char *endptr;

	printf("strtod:%f strtof:%f \n", strtod(str, &endptr), strtof(str, NULL));
	printf("接收的首次遇到非数字后面的字符段:%s\n", endptr);
	return 0;
}

//输出结果
123 123 123
strtod:123.000000 strtof:123.000000
接收的首次遇到非数字后面的字符段:hello

另外笔者还使用过与内存块处理相关的一些函数,例如memchrmemcmpmemmovememsetmemcpy对于处理字符串也很有用。memchr 用于在内存块中查找字符,memcmp 用于比较内存块,memmove 用于复制内存块(可能重叠),而memset 用于设置内存块的值,memcpy 用于复制内存块的值。后续可能重新整理关于这块内容。

标签:const,函数,str1,char,strsep,printf,字符串,小结
From: https://www.cnblogs.com/cino/p/18212353

相关文章

  • Python中别再用 ‘+‘ 拼接字符串了!
    大家好,在Python编程中,我们常常需要对字符串进行拼接。你可能会自然地想到用+操作符将字符串连接起来,毕竟这看起来简单明了。在Python中,字符串是不可变的数据类型,这意味着一旦字符串被创建,它就不能被修改。因此,当你尝试通过使用+来连接字符串时,实际上Python会创建......
  • 基本数据类型和字符串转换
    基本数据类型和字符串转换中8种包装类提供不同类型间的转换方式:Number父类中提供的6种方法。parseXXX()静态方法valueof()静态方法注意:需保证类型兼容,否则抛出NumberFormatException异常。源代码:publicclassDemo01{publicstaticvoidmain(String[]args){//基本数据类......
  • 吴恩达机器学习 week1 一元回归模型的成本函数
    01学习目标    学习建立一元线性回归模型的成本函数02实现工具  (1)代码运行环境       Python语言,Jupyternotebook平台  (2)所需模块       NumPy,Matplotlib,lab_utils_uni      (lab_utils_uni是课程中用于绘制复......
  • 面试问 Redis 的字符串原理是什么?答不出被 Pass 了!
    引言:在Redis中,并没有使用C标准库提供提供的字符串,而是实现了一种动态字符串,即SDS(SimpleDynamicString),然后通过这种数据结构来表示字符串,面试中除了基本数据类型让你去讲解,此外还会讲1-2种数据结构的底层原理和优势。题目redis的字符串为什么要升级SDS,而不用C......
  • JS核心语法【流程控制语句、函数】;DOM【查找元素、操作元素、事件】--学习JavaEE的day
    day48JS核心技术JS核心语法继day47注意:用到控制台输出、弹窗流程控制语句Ifelse、For、For-in(遍历数组时,跟Java是否一样【java没有】)、While、Dowhile、break、continue案例:1.求1-100之间的偶数之和<!DOCTYPEhtml><html> <head> <metacharset="UTF......
  • C#中一种回调函数用法
    做一个局域网文件传输工具,界面点按钮下载文件,同时显示文件下载进度条,而下载文件流是调用的一个开源的公共类库里的一个方法,方法里不可实现进度条更新,因为是公共的,不应有侵入式代码,但为了实时更新进度条的值,也只能修改文件传输方法,由此我想到了回调函数。点击按钮是调用文件下载方......
  • 函数(3)
    函数与数组,数组作为函数参数:1.函数传参  实参赋值给形参 2.数组传参形式上:voidprintArray(inta[],intlen);//形参1表示要传的是数组这种数据                  //形参2要传的是数组的长度(因为在函数传参后只能传入数组......
  • XML Schema 字符串数据类型及约束详解
    字符串数据类型用于包含字符字符串的值。字符串数据类型可以包含字符、换行符、回车符和制表符。以下是模式中字符串声明的示例:<xs:elementname="customer"type="xs:string"/>您文档中的一个元素可能如下所示:<customer>JohnSmith</customer>或者可能是这样的:<custome......
  • 【c语言】一篇文章搞懂函数递归
    ......
  • XML Schema 字符串数据类型及约束详解
    字符串数据类型用于包含字符字符串的值。字符串数据类型可以包含字符、换行符、回车符和制表符。以下是模式中字符串声明的示例:<xs:elementname="customer"type="xs:string"/>您文档中的一个元素可能如下所示:<customer>JohnSmith</customer>或者可能是这样的:<c......