c语言学习笔记之字符串库函数和逗号表达式

逗号表达式

c 复制代码
#include <stdio.h>
 
int main(){
    int a = 10;
    int b =5;
    int c = 6;
    int d = (a = 2+3,b = a-4,c= b+2);
    printf("%d",d);
}

打印结果为:

逗号表达式,从左往右依次进行,将最后一个表达式的值赋值给变量.

c语言字符串相关库函数

求字符串长度 strlen
长度不受限制的字符串函数 strcpy , strcat , strcmp
长度受限制的字符串函数 strncpy , strncat , strncmp
字符串查找 strstr , strtok
错误信息报告 strerror
内存操作函数 memcpy , memmove , memset , memcmp

下面分别进行详细介绍

strlen <----求字符串长度

所需头文件

c 复制代码
#include <string.h>

参数类型

c 复制代码
size_t strlen(const char* string);

参数类型为char*,因此我们传进来的参数需要是字符串的地址,并且这里的指针变量用const修饰,可以保证传进来的字符串不被修改. 因为我们求字符串的长度是不需要对字符串进行修改的,加上const保证程序的安全. size_t是函数的返回值类型,他是一个无符号整型. 关于这个无符号整形,会导致一些问题,可以用一个例子说明.

c 复制代码
#include <stdio.h>
#include <string.h>
int main()
{
	char* str1 = "abc";
	char* str2 = "abcedf";
	if (strlen(str1) - strlen(str2) > 0)
	{
		printf("str1 is bigger\n");
	}
	else
	{
		printf("str2 is bigger\n");
	}
	return 0;
}

我们可以看出,str1比str2短,因此结果应该为负数,小于0,打印str2 is bigger. 但是运行程序,发现结果如下:

这和我们所认为的不同,就是因为strlen函数返回的是一个无符号整型,因此当两个无符号整型进行减法的时候,得到的结果仍然是无符号整型,因此虽然得到的结果为负数,但是在无符号整型看来,这是一个很大的正数,前面的符号位被认为是一个有效的数字位,导致结果大于0.打印的是str1 is bigger. 如果想要进行比较长度大小,可以直接strlen(str1) > strlen(str2)这样子比较就没有问题了.

注意事项

  1. strlen函数返回的是在字符串中 \0 前面出现的字符个数(不包含 '\0' ),因此当字符串中存在\0的时候,得到的不是字符串的长度
  2. 参数指向的字符串必须要以 '\0' 结束,否则strlen会运行到读取到\0才结束
  3. 注意函数的返回值为size_t,是无符号的,在计算的时候要注意

strcpy<----字符串拷贝

所需头文件

c 复制代码
#include <string.h>

参数类型

c 复制代码
char *strcpy(char *strDestination,const char* strSource);

参数类型是两个字符串指针地址,第一个是需要被拷贝的字符串地址,第二个参数是要拷贝的内容. 其中要拷贝的内容由于不需要改变,用const修饰,保证程序的安全. 函数的返回值类型为char*类型,是拷贝完成后的字符串地址.

注意事项

  1. strSource必须以\0结束,否则strcpy函数不知道什么时候拷贝结束
  2. 拷贝会将\0也拷贝到strDestination中
  3. strDestination必须足够大,确保放的下strSource,防止越界访问
  4. strDestination不能被const修饰,必须是可变的.

strcat<---字符串追加

所需头文件

c 复制代码
#include <string.h>

参数类型

c 复制代码
char *strcat(char *strDestination,const char* strSource);

参数类型和strcpy是一致的,就不再赘述了. 返回值类型也是char*类型.用来返回被追加后的字符串地址.

具体功能是将两个字符串拼接起来.

c 复制代码
#include <stdio.h>
#include <string.h>
int main()
{
	char str1[20] = "abcd";
	char str2[] = "efgh";
	char* ret = strcat(str1, str2);
	printf("%s", ret);
	return 0;
}

运行结果如下:

strcat的注意事项和strcpy类似,唯一的区别在于strDestination的空间要足够大,能够放得下strSource+原strDestination才行.而strcpy只需要能够放得下strSource就行.

strcmp<---字符串比较

所需头文件

c 复制代码
#include <string.h>

参数类型

c 复制代码
int strcmp(const char *string1,const char* string2);

参数为两个字符串指针,都被const修饰,不需要对字符串进行修改,只是进行比较,保证程序的安全性. 返回值类型为int类型.

strcmp函数对返回值的规定如下:

  • 标准规定
    • 第一个字符串大于第二个字符串,返回大于0的数字
    • 第一个字符串等于第二个字符串,返回0
    • 第一个字符串小于第二个字符串,返回小于0的数字

strcmp函数的功能就是比较两个字符串的大小,比较的是字符串的内容而不是字符串的长度.

比方说abcde就小于accd因为从第二个字符开始,b的ASCII码小于c的ASCII码. 但字符串的长度确实abcde大于accd

strncpy<---受限制的字符串拷贝

所需头文件

c 复制代码
#include <string.h>

参数类型

c 复制代码
char *strncpy( char *strDestination,const char *strSource,size_t count);

前两个参数类型和strcpy是一致的,只是多了个size_t类型的参数count用来控制拷贝字符的个数. 这里的count为多少,就从strSource中拷贝多少个字符到strDestination中. 返回值类型也和strcpy一样,返回的是被拷贝的字符串的地址

strncpy的功能如下:

c 复制代码
#include <stdio.h>
#include <string.h>
int main()
{
	char str1[20] = "abcd";
	char str2[] = "kpl";
	char* ret = strncpy(str1, str2, 2);
	printf("%s", ret);
	return 0;
}

运行结果如下:

作用就是经str2的前面两个字符串拷贝到str1的前面两位.因此结果为kpcd

注意事项和strcpy是一致的.

strncat<---长度受限制的字符串追加

所需头文件

c 复制代码
#include <string.h>

参数类型

c 复制代码
char *strncat(char *strDestination,const char* strSource, size_t count);

和strncpy类似,也是多了个size_t类型的count用来控制追加字符串的长度.返回的也是被追加字符串的地址.

c 复制代码
#include <stdio.h>
#include <string.h>
int main()
{
	char str1[20] = "abcd";
	char str2[] = "efgh";
	char* ret = strncat(str1, str2, 2);
	printf("%s", ret);
	return 0;
}

运行结果为:

将str2中的前面两个字符追加到str1中,因此结果为abcdef

注意事项和strncat一致.

strncmp<----长度受限制的字符串拷贝

所需头文件

c 复制代码
#include <string.h>

参数类型

c 复制代码
int strncmp(const char *string1,const char* string2, size_t count);

类似的,多了个size-t类型的count,用来控制比较字符串的长度. 返回的值和strcmp一样.

c 复制代码
#include <stdio.h>
#include <string.h>
int main()
{
	char str1[] = "abcd";
	char str2[] = "abkl";
	int ret = strncmp(str1, str2, 2);
	printf("%d", ret);
	return 0;
}

运行结果为:

由于str1和str2前面两个字符都为ab,因此比较的结果是两者相等,因此结果为0

如果使用strcmp比较,结果为小于0的数字.

strstr<----字符串查找函数

所需头文件

c 复制代码
#include <string.h>

参数类型

c 复制代码
char *strstr(const char *string,const char* strCharSet);

参数是两个指针,分别接收的是被查找的字符串地址和查找内容的字符串地址,两个指针都被const修饰. 返回值类型为char*,所以接收的是字符string被strcharset查找到后,对应查找到的字符串的首地址.

c 复制代码
#include <stdio.h>
#include <string.h>
int main()
{
	char str1[] = "abcdefdgh";
	char str2[] = "d";
	char* ret = strstr(str1, str2);
	printf("%s", ret);
	return 0;
}

运行结果为:

相关推荐
DdddJMs__135几秒前
C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
c语言·leetcode·题解
行然梦实9 分钟前
学习日记_20241110_聚类方法(K-Means)
学习·kmeans·聚类
马船长15 分钟前
制作图片木马
学习
秀儿还能再秀26 分钟前
机器学习——简单线性回归、逻辑回归
笔记·python·学习·机器学习
WCF向光而行31 分钟前
Getting accurate time estimates from your tea(从您的团队获得准确的时间估计)
笔记·学习
娃娃丢没有坏心思39 分钟前
C++20 概念与约束(2)—— 初识概念与约束
c语言·c++·现代c++
wang09071 小时前
工作和学习遇到的技术问题
学习
ahadee2 小时前
蓝桥杯每日真题 - 第11天
c语言·vscode·算法·蓝桥杯
Li_0304062 小时前
Java第十四天(实训学习整理资料(十三)Java网络编程)
java·网络·笔记·学习·计算机网络
心怀梦想的咸鱼2 小时前
ue5 蓝图学习(一)结构体的使用
学习·ue5