C语言之字符函数和字符串函数及内存函数

目录

前言

长度不受限制字符串函数

strlen函数

使用:

strcpy函数

使用:

strcat函数

使用:

strcmp函数

使用:

长度受限制字符串函数

strncpy函数

使用:

strncat函数

使用:

strncmp函数

使用:

其他字符串函数

strstr函数

使用:

strtok函数

使用:

strerror函数

使用:

字符分类函数

isdigit函数

使用:

islower函数

使用:

其他字符分类函数(类似)

字符转换函数

tolower函数

使用:

内存函数

memcpy函数

使用:

memmove函数

使用:

memcmp函数

使用:

memset函数

使用:

前言

C语言中对字符和字符串的处理是频繁的,但C语言本身是没有字符串类型的,字符串通常放在常量字符串中,或者字符串数组中,字符串常量适用于那些对他不做修改的字符串函数

长度不受限制字符串函数

strlen函数

注意:size_t 为无符号整形的意思

使用:

引入头文件:include <string.h>

#include <stdio.h>
#include <string.h>
void main() {
	char c[] = "hello";//字符串与字符数组不同,后面默认有'\0';
	char d[] = { 'h','e','l','l','o' };
	printf("%d\n", strlen(c));//5
	printf("%d\n", strlen(d));//随机值
}

strcpy函数

  • 将source字符串复制到destination上(destination如果不为空串则会被source字符串覆盖),返回值为destination的首地址
  •  源字符串必须以'\0'结束
  • 会将源字符串的'\0'拷贝到目标字符串
  • 目标字符串空间必须足够大,以确保能存放源字符串
  • 目标空间必须可变
  • 学会模拟实现 

使用:

引入头文件:include <string.h>

#include <stdio.h>
#include<string.h>
void main() {
	char arr1[20] = { 0 };
	char arr2[] = "hello world";
	strcpy(arr1, arr2);//返回值为arr1的首地址
	printf("%s", arr1);
}

strcat函数

  • 把源字符串数据追加到目标字符串当中去 ,返回值为destination的首地址
  • 源字符串必须以'\0'结束
  • 目标空间必须足够的大,能容纳源字符串的内容
  • 目标空间必须可修改
  • 不能自己给自己追加(原因:'\0'被替换不能暂停循环)

使用:

引入头文件:include <string.h>

#include <stdio.h>
#include<string.h>
void main() {
	char arr1[20]="hello ";
	strcat(arr1, "world");//追加字符串,返回值为目标字符串首地址
	printf("%s\n", arr1);//hello world
}

strcmp函数

两个字符串的比较

  1. ==比较,比较的是2个字符串的地址值
  2. strcmp(str1,str2)函数比较两个字符串的内容是否相等,如果两个字符串内容相等,那么此函数便会返回0

该函数返回值如下:

  • 如果返回值小于 0,则表示 str1 小于 str2。
  • 如果返回值大于 0,则表示 str1 大于 str2。
  • 如果返回值等于 0,则表示 str1 等于 str2。

比较方法:比较对应位置上的ASCII码值从头到尾逐个比较当第一次出现ASCII码值不同时,则此字符ASCII码大字符所在的字符串大于另一个字符串。

使用:

引入头文件:include <string.h>

#include <stdio.h>
#include<string.h>
void main() {
	char arr1[] = "abc";
	char arr2[] = "abc";
	if (0==strcmp(arr1,arr2))
	{
		printf("两个字符串内容相等");
	}
	else if(0<strcmp(arr1,arr2))
	{
		printf("arr1大于arr2");
	}
	else
	{
		printf("arr1小于arr2");
	}
}

长度受限制字符串函数

strncpy函数

  •  将源字符串的前num个字符拷贝到目标字符串当中,返回值为目标字符串的首地址
  • 如果原数组拷贝个数超出源字符串长度,则之后的拷贝用'\0'补充
  • 目标空间必须足够的大,能容纳源字符串的内容
  • 目标空间必须可修改

使用:

引入头文件:include <string.h>

#include <stdio.h>
#include<string.h>
void main() {
	char arr1[20] = "hello";
	char arr2[] = "hi world";
	printf("%s\n", strncpy(arr1, arr2,2));//hillo
}

strncat函数

  • 将源字符串的前num个字符追加到目标字符串当中,返回值为目标字符串的首地址
  • 如果原数组拷贝个数超出源字符串长度,则只追加到源字符串长度
  • 可以自己给自己追加
  • 目标空间必须足够的大,能容纳源字符串的内容
  • 目标空间必须可修改

使用:

引入头文件:include <string.h>

#include <stdio.h>
#include<string.h>
void main() {
	char arr1[20] = "hello ";
	char arr2[] = "world hahaha";
	printf("%s\n", strncat(arr1, arr2,5));//hello world
}

strncmp函数

  • 将str1字符串与str2字符串比较num个字符,返回值类型同strcmp 

使用:

引入头文件:include <string.h>

#include <stdio.h>
#include<string.h>
void main() {
	char* p = "abcd";
	char* q = "abed";
	int ret = strncmp(p, q, 2);//比较2个字符
	int res = strncmp(p, q, 3);//比较3个字符
	printf("%d\n", ret);//0
	printf("%d\n", res);//-1
}

其他字符串函数

strstr函数

  •  在str1字符串中查找是否包含str2字符串,如果存在则返回的是第一次出现位置的字符串,如果不存在,则返回的是null,如果str2传的为空串则返回str1

使用:

引入头文件:include <string.h>

#include <stdio.h>
#include<string.h>
void main() {
	char arr1[] = "abcdefabcdef";
	char arr2[] = "bcd";
	//在arr1中查找是否包含arr2
	printf("%s\n", strstr(arr1, arr2));//bcdefabcdef
}

strtok函数

  •  seq是个字符串,定义了用作分隔符的字符集合
  • 第一个参数指定一个字符串,它包含了0个或者多个由seq字符串中一个或者多个分隔符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用’\0'替换结尾,返回一个指向这个标记的指针。(注意:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝内容,并且可修改的)。
  • strtok函数的第一个参数不为null,函数将找到str中的第一个标记,strtok函数将保存他在字符串中的位置
  • strtok函数的第一个参数为null,函数将在同一个字符串中被保存的位置开始,查找下一个标记
  • 如果字符串中不存在更多标记,则返回null指针

使用:

引入头文件:include <string.h>

#include <stdio.h>
#include<string.h>
void main() {
	char arr1[] = "abcdefabcdef";
	char tmp[30] = { 0 };
	strcpy(tmp, arr1);//临时拷贝
	char arr2[] = "cf";//分隔符的集合
	char* ret = NULL;
	for (ret = strtok(tmp, arr2); ret != NULL; ret = strtok(NULL, arr2)) {
		printf("%s\n", ret);
	}
}

strerror函数

  • 调用库函数失败的时候都会设置错误码,errnum表示错误码,将错误码传给strerror函数的时候,该函数将会返回错误码所对应的错误信息字符串的首地址。(将错误码翻译成错误信息)

使用:

引入头文件:include <string.h>、include <errno.h>

#include <stdio.h>
#include<string.h>
void main() {
	printf("%s\n", strerror(0));//No error
	printf("%s\n", strerror(1));//Operation not permitted
	printf("%s\n", strerror(2));//No such file or directory
	printf("%s\n", strerror(3));//No such process
	printf("%s\n", strerror(4));//Interrupted function call
}

注意:errno为在C语言中的全局错误码,要使用必须引入头文件include <errno.h>

#include <stdio.h>
#include<string.h>
#include <errno.h>
int main()
{
    FILE* pFile;
    pFile = fopen("test.txt", "r");
    if (pFile == NULL)
        printf("Error opening file test.txt: %s\n", strerror(errno));
    //当fopen这个库函数调用失败时就会有错误码,然后把错误码放到后面的errno这个变量里去,然后strerror函数就会根据错误码,把对应的错误信息打印出来
    return 0;
}

字符分类函数

isdigit函数

判断函数是不是字符函数 

  • 里面的参数传字符的ASCII码值,如果该字符是数字字符,则返回非零的值,如果该字符不是数字字符,则返回0;

使用:

引入头文件:include <ctype.h>

#include <stdio.h>
#include <ctype.h>
void main() {
	char c = '6';//数字字符
	char d = '@';//非数字字符
	int ret = isdigit(c);
	int res = isdigit(d);
	printf("c=%d,d=%d", ret,res);//c=4,d=0
}

islower函数

  

判断一个字符是不是小写字符

  • 里面的参数传字符的ASCII码值,如果该字符是小写字符,则返回非零的值,如果该字符不是小写字符,则返回0;

使用:

引入头文件:include <ctype.h>

#include <stdio.h>
#include <ctype.h>
void main() {
	char c = 'A';//大写字符
	char d = 'a';//小写字符
	int ret = islower(c);
	int res = islower(d);
	printf("c=%d,d=%d", ret,res);//c=0,d=2
}

其他字符分类函数(类似)

字符转换函数

tolower函数

  

字符转小写

  • 里面的参数传大写字符的ASCII码值,之后此函数会将该大写字符转化为小写字符的ASCII码值返回过来。

使用:

引入头文件:include <ctype.h>

#include <stdio.h>
#include <ctype.h>
void main() {
	char arr[20] = "HELLOWORLD";
	int i = 0;
	while (arr[i]!='\0')
	{
		if (isupper(arr[i])) {
			arr[i] = tolower(arr[i]);
			printf("%c", arr[i]);
		}
		i++;
	}
}
//helloworld

注意:toupper函数与此类似(字符转大写)

内存函数

memcpy函数

内存拷贝函数

  •  把source空间指向的数据拷贝到destination的空间里面去,里面的num参数表示要拷贝多大的空间(以字节为单位),返回值为destination的首地址
  • memcpy函数只能拷贝不重叠的内存

使用:

引入头文件:include <string.h>

#include <stdio.h>
#include <string.h>
void main() {
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	memcpy(arr2, arr1, 20);//将arr1里面的20字节(5个元素)拷贝到arr2中
	int i = 0;
	for (i = 0; i < 10; i++) {
		printf("%d ", arr2[i]);
	}
	//1 2 3 4 5 0 0 0 0 0
}
#include <stdio.h>
#include <string.h>
void main() {
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	int* p=(memcpy(arr2, arr1, 20));//将arr1里面的20字节(5个元素)拷贝到arr2中
	printf("%d ", *p);//1
}

memmove函数

内存移动函数 

  •  把source空间指向的数据移动到destination的空间里面去,里面的num参数表示要移动多大的空间(以字节为单位),返回值为destination的首地址
  • memmove函数能处理重叠的内存的情况

使用:

引入头文件:include <string.h>

#include <stdio.h>
#include <string.h>
void main() {
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(arr1+2, arr1, 20);//将arr1里面的20字节(5个元素)移动到arr1+2中
	int i = 0;
	for (i = 0; i < 10; i++) {
		printf("%d ", arr1[i]);
	}
	//1 2 1 2 3 4 5 8 9 10,用memcpy不能实现
}

memcmp函数

内存比较函数 

  • ptr1内存里面的和ptr2内存里面的前num个字节如果一样那么就返回0,如果ptr1内存中的数据和ptr2内存中的数据不一样了(前num个字节内)则不一样的数据中,若ptr1>ptr2则返回大于0的数,若ptr1<ptr2则返回小于0的数。

使用:

引入头文件:include <string.h>

#include <stdio.h>
#include <string.h>
void main() {
	float arr1[] = { 1.0,2.0,3.0,4.0 };
	float arr2[] = { 1.0,3.0};
	int ret = memcmp(arr1, arr2, 4);//比较前4个字节
	int res = memcmp(arr1, arr2, 8);//比较前8个字节
	printf("ret=%d,res=%d\n", ret, res);//ret=0,res=-1
}

memset函数

内存设置函数 (以字节为单位设置内存)

  • 把ptr所指向的这块内存的前num”字节“的内容全部设置成我们想要的value值,返回ptr所指向这块内存的首地址
  • 整形数组设置不能用memset

使用:

引入头文件:include <string.h>

#include <stdio.h>
#include <string.h>
void main() {
	char arr[] = "hello world";
	char* c=memset(arr, 'x', 5);//将arr数组的前5个字节改变为x
	printf("%s\n", c);//xxxxx world
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值