深入了解C语言字符函数和字符串函数

目录
  • 前言
  • 求字符串长度
    • strlen介绍
    • strlen直接使用:
    • strlen模拟实现:
    • strlen对比sizeof
  • 长度不受限制的字符串函数
    • strcpy
      • 直接使用
      • 模拟实现:
    • strcat
      • 直接使用:
      • 模拟实现:
    • strcmp
      • 运行结果:
      • 模拟实现:
  • 长度受限制的字符串函数
    • strncpy
    • strncat
    • strncmp
  • 字符串查找
    • strstr
    • strtok
  • 字符分类函数
  • 内存操作函数
    • memcpy
    • memmove
    • memcmp
  • 总结

前言

C语言中对字符串的处理很是繁琐,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中。字符串常量适用于那些对它不做修改的字符串函数。直接使用下面函数需要包含其头文件**<string.h>**

求字符串长度

strlen介绍

语法/原型:

size_t strlen(const char* str); //str 表示要求长度的字符串。

strlen所作的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。

strlen直接使用:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
	char a[] = "abcdefg";
	char b[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g' };
	int len1 = strlen(a);
	int len2 = strlen(b);
	printf("%d\n", len1);
	printf("%d\n", len2);
	return 0;
}

输出结果:

a,b数组对比:

strlen模拟实现:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>
int my_strlen(const char* str)
{
	int count = 0;//计数器
	assert(str != NULL);
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char a[] = "abcdefg";
	int len  = my_strlen(a);//使用自己创建的strlen函数来计算数组长度!
	printf("%d\n", len);
	return 0;
}

输出结果:

strlen对比sizeof

strlen()的一种实现就是遍历字符串,遇到'\0'就终止,因而返回的结果是第一个'\0'前字符元素的个数 sizeof 常用来求变量占用内存空间的大小,因而它返回的是存储字符串的变量所占用的内存空间大小,用来求字符串的长度,只在特定情况下可行,即字符数组刚好被一个字符串占满。

代码检验:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
	char a[] = "abcdefg";
	printf("%d\n", strlen(a));
	printf("%d\n", sizeof(a));//一个字符所占空间为一个字节
	printf("%d\n", (sizeof(a) / sizeof(a[0])));
	return 0;
}

运行结果:

长度不受限制的字符串函数

strcpy

  • 语法/原型:char* strcpy(char* dest , const char * src)
  • 头文件:#include <string.h> 和 #include <stdio.h>
  • 功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间.
  • 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
  • 注:源字符串必须以'\0'结尾,并且会将源字符串中的'\0'拷贝到目标空间。

直接使用

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>

int main()
{
	char  a[10];
	char  b[] = "hello bit";
	strcpy(a, b);
	printf("%s", a);
	return 0;
}

运行结果:

模拟实现:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void my_strcpy(char *a, const char *b)
{
	int i = 0;
	while (*b != '\0')
	{
		*a = *b;
		*a++;
		*b++;
	}
	*a++ = '\0';
}
int main()
{
	char  a[10];
	char  b[] = "hello bit";
	my_strcpy(a, b);
	printf("%s", a);
	return 0;
}

运行结果同上!

strcat

  • 语法/原型:char * strcat(char * dest, const char* src);
  • 头文件: include<string.h>
  • 功能:把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除dest原来末尾的“\0”)。要保证dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针。
  • 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

直接使用:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>

int main()
{
	char  a[20]="hello ";
	char  b[20] = "bit ";
	char c[20] = "hello ";
	strcat(a, b);
	strcat(b, c);
	printf("%s\n",a);
	printf("%s\n", b);
	return 0;
}

模拟实现:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
void my_strcat(char *x, const char *y)
{
	assert(x != NULL);
	assert(y != NULL);
	while (*x)//找到目标字符串中的'\0'
	{
		x++;
	}
	while ((*x++ = *y++))
	{
		;
	}

}
int main()
{
	char  a[20]="hello ";
	char  b[20] = "bit ";
	my_strcat(a, b);
	printf("%s\n",a);
	return 0;
}

运行结果:

strcmp

  • 语法/原型:int strcmp(const char *s1,const char *s2);
  • 头文件: include<string.h>
  • 功能:用于对两个字符串进行比较(区分大小写) 直接使用:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>

int main()
{
	char  a[20]=  "ABCD";
	char  b[20] = "ABCG";
	int i=strcmp(a, b);
	if (i > 0)
	{
		printf("a>b\n");
	}
	else if (i==0)
	{
		printf("a=b\n");
	}
	else
	{
		printf("a<b\n");
	}
	return 0;
}

运行结果:

模拟实现:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strcmp(const char *x, const char *y)
{
	int ret = 0;
	assert(x != NULL);
	assert(y != NULL);
	while (!(ret = *(unsigned char *)x - *(unsigned char *)y) && *y)
	{
		++x;
		++y;
	}
	if (ret < 0)
		ret = -1;
	else if (ret >0)
		ret = 1;
	return ret;
}
int main()
{
	char  a[20]=  "ABCD";
	char  b[20] = "ABCG";
	int i=my_strcmp(a, b);
	if (i > 0)
	{
		printf("a>b\n");
	}
	else if (i==0)
	{
		printf("a=b\n");
	}
	else
	{
		printf("a<b\n");
	}
	return 0;
}

运行结果同上!

长度受限制的字符串函数

strncpy

  • 语法/原型: char *strncpy(char *destinin, char *source, int maxlen);
  • 参数:destinin:表示复制的目标字符数组;source:表示复制的源字符数组;maxlen:表示复制的字符串长度.
  • 对比: 相对于strcpy增加了长度限制
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[20]="1234567";
	char arr2[] = "abcdefg";
	strncpy(arr1, arr2, 3);//拷贝3个字符到arr1数组
	printf("%s\n", arr1);
	return 0;
}

运行结果:

strncat

语法/原型:char * strncat(char *dest, const char *src, size_t n);参数说明: dest指向目标字符串,src为指向源字符串。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h.>
#include<string.h>
int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "csdn";
	strncat(arr1, arr2, 1);
	printf("%s\n", arr1);
	return 0;
}

strncmp

语法/原型:int strncmp(const char *str1, const char *str2, size_t n)参数说明:str1-- 要进行比较的第一个字符串。str2-- 要进行比较的第二个字符串。n-- 要比较的最大字符数。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
	char* a = "abcdef";
	char* b = "abchij";
	int i = strncmp(a, b, 4);
	if (i > 0)
	{
		printf("a>b\n");
	}
	else if (i == 0)
	{
		printf("a=b\n");
	}
	else
	{
		printf("a<b\n");
	}
	return 0;
}

字符串查找

strstr

  • 语法/原型:char *strstr(const char *str1, const char *str2);
  • 参数说明:str1 - 要查找的字符串或字符串指针; str2 - 要查找的子串
  • 功能:判断字符串str2是否是str1的子串。
  • 返回值: 函数返回str2在str1中首次出现的地址;否则,返回NULL。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "hello bit";
	char arr2[] = "bit";
	char* ret = strstr(arr1, arr2);
	if (ret == NULL)
		printf("没找到\n");
	else
		printf("找到了:%s\n", ret);
	return 0;
}

strtok

  • 语法/原型:char * strtok(char *s, const char *delim);
  • 功能参数:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。
  • 说明:strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。

字符分类函数

内存操作函数

该系列函数所需头文件:#include <string.h>

memcpy

  • 语法/原型:void *memcpy(void *destin, void *source, unsigned n);
  • 参数说明:destin-- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。source-- 指向要复制的数据源,类型强制转换为 void* 指针。 n-- 要被复制的字节数。
  • 功能:从源source所指的内存地址的起始位置开始拷贝n个字节到目标destin所指的内存地址的起始位置中。
  • 返回值: 该函数返回一个指向目标存储区destin的指针。

注:这个函数遇到'\0‘的时候并不会停下来。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[20] = { 0 };
	memcpy(arr2, arr1, 3);//数字3的单位是字节,而一个字符占一个字节
	printf("%s\n", arr2);
	return 0;
}

运行结果:

memmove

  • 语法/原型:void memmove( void dest, const void* src, size_t count );
  • 参数说明:
  • 功能:由src所指内存区域复制count个字节到dest所指内存区域。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
	const char a[] = "abcdefg";
	const char b[] = "1234567";
	printf("a = %s,b = %s\n", a, b);
	memmove(a, b, 7);
	printf("a = %s,b = %s\n", a, b);
	return(0);
}

memcmp

  • 语法/原型:int memcmp(const void *str1, const void *str2, size_t n));
  • 参数说明:str1-- 指向内存块的指针。str2-- 指向内存块的指针。n-- 要被比较的字节数。
  • 功能:比较内存区域buf1和buf2的前count个字节。
  • 返回值:如果返回值 < 0,则表示 str1 小于 str2。返回值 > 0,则表示 str2 小于 str1。如果返回值 = 0,则表示 str1 等于 str2。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
	int  a[] = { 1, 2, 3 };
	int  b[] = { 1, 5};
	int ret = memcmp(a,b, 8);//注意第3个参数的单位是字节
	if (ret > 0)
	{
		printf("a>b\n");
	}
	else if (ret < 0)
	{
		printf("a<b\n");
	}
	else
	{
		printf("a==b\n");
	}
	return 0;
}

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C语言去除相邻重复字符函数的实现方法

    C语言去除相邻重复字符函数的实现方法 字符去重函数 功能:去重字符串相邻重复的字符,不相邻的不用去重 参数: arg1 -- 输入字符串 arg2 -- 字符串开始位置 arg3 -- 字符串结束位置 要求: 输入参数为arg1时, 对这个字符串去重 输入参数为arg1,arg2时, 从arg2位置到字符串结束,去重 输入参数为arg1,arg2,arg3时,从arg2到arg3位置,去重 src/include/catalog/pg_proc.h DATA(insert OID = 6669

  • PHP常用字符串函数用法实例总结

    本文实例总结了PHP常用字符串函数用法.分享给大家供大家参考,具体如下: 字符串函数 explore 使用一个字符串分割另一个字符串 结果为数组 <?php $str = 'a,b,c,d'; $res = explode(',',$str); var_dump($res); implode(join) 将一个一维数组的值转化为字符串 <?php $arr = ['a'=>1,'b'=>2]; $res = implode(',',$arr); var_dump($res); ht

  • C语言字符函数、内存函数功能及实现代码

    C语言字符函数.内存函数 功能及实现 strlen函数(求字符串长度)注意点模拟实现 strcpy函数(字符串拷贝函数)注意点模拟实现 strcat函数(字符串衔接函数)注意点模拟实现 strcmp函数注意点模拟实现 strstr函数模拟实现 strtok函数使用 strerror函数使用 memcpy函数注意点模拟实现 memmove函数注意点模拟实现 memset函数注意点 strlen函数(求字符串长度) 统计字符串长度直到\0为止 注意点 1.属于<string.h>库 2.参数为字符

  • SQL SERVER2012中新增函数之字符串函数CONCAT详解

    介绍 SQLSERVER 2012新增了两个字符串函数CONCAT和FORMAT.本文首先介绍一下CONCAT,CONCAT函数的作用是可以返回多个字符串拼接后的结果. CONCAT 函数最多可以连接255个字符变量,当调用这个函数的时候需要至少接收两个参数,参数类型不一定是字符串类型,也可以是可以隐式转换为字符串的类型比如int ,float等类型.只要符合sql 2012的能隐式转换为字符串的规则即可,当我们想把两个值类型的数据连接起来的时候,不需要先将它们转为nvarchar然后再通过"+

  • php字符串函数 str类常见用法示例

    本文实例讲述了php字符串函数 str类常见用法.分享给大家供大家参考,具体如下: str_split(string, leg);//将一个字符 串转换为数组,参数1:要被转换的字符串,参数2:每 段长度, 返回一个转换后的数组 例: <?php $str = "Hello Friend"; $arr = str_split($str, 3); Array (     [0] => Hel     [1] => lo     [2] => Fri     [3]

  • C语言详细分析常见字符串函数与模拟实现

    目录 一. strlen(求长度) 二. strcpy(拷贝) 三.strcat(追加) 四.strcmp 五.strncpy 六.strncat 七.strncmp 八.strstr 九.strtok 十.strerror 十一.memcpy 十二.memmove 十三.memcmp 十四.memset 一. strlen(求长度) size_t  strlen ( const char * str ) 函数的返回值类型为size_t,为无符号数,且strlen返回值为字符串中‘\0’前的字符

  • C语言超详细讲解字符串函数和内存函数

    目录 字符串函数 长度不受限制的字符串函数 strlen strcpy strcat strcmp 长度受限制的字符串函数介绍 strncpy strncat strncmp 字符串查找以及错误报告 strstr strtok strerror 内存操作函数 memcpy memmove memcmp 字符串函数 长度不受限制的字符串函数 strlen size_t strlen ( const char * str ) 求字符串长度: 字符串以'\0' 作为结束标志,strlen函数返回的是在

  • C语言超全面讲解字符串函数

    目录 1.gets函数 2.puts函数 3.strcat函数 4.strcpy函数(strncpy函数) 5.strcmp函数(strncmp函数) 6.strlen函数 7.strlwr函数 8.strupr函数 9.strstr函数 注意:在使用字符串处理函数时,一定要使用#include <string.h>开头 1.gets函数 其形式为:gets(字符数组)——输入字符串的函数 作用是从终端输入一个字符串到字符数组,并且得到一个函数值. 2.puts函数 其形式为:puts(字符数

  • 深入了解C语言字符函数和字符串函数

    目录 前言 求字符串长度 strlen介绍 strlen直接使用: strlen模拟实现: strlen对比sizeof 长度不受限制的字符串函数 strcpy 直接使用 模拟实现: strcat 直接使用: 模拟实现: strcmp 运行结果: 模拟实现: 长度受限制的字符串函数 strncpy strncat strncmp 字符串查找 strstr strtok 字符分类函数 内存操作函数 memcpy memmove memcmp 总结 前言 C语言中对字符串的处理很是繁琐,但是C语言本

  • C语言字符函数与字符串函数详解

    目录 本章重点 前言 1.strlen函数 注意点1 注意点2 2.strcpy 注意点1: 注意点2: 注意点3: 注意点4: 总结 本章重点 重点介绍处理字符和字符串的库函数的使用和注意事项 1.求字符串长度 strlen 2.长度不受限制的字符串函数 strcpy ,strcat, strcmp 3.长度受限制的字符串函数 strncpy,strncat ,strncmp 4.字符串查找 strstr,strtok 5.错误信息报告 strerror 6.字符操作 7.内存操作函数 mem

  • C语言的字符函数和字符串函数详解

    目录 一.字符&字符串函数 1.strlen--求字符串长度 2.1.strcpy--拷贝字符串 2.2.strcat--追加字符串/链接字符串 2.3.strcmp--字符串比较 2.4.strncpy--受限的字符串拷贝 2.5.strncat--受限连接字符串 2.6.strncmp--受限的比较字符串 总结 一.字符&字符串函数 1.strlen--求字符串长度 释:是所求‘\0’之前的字符个数.库函数类型-size_t(const char*)    size_t == unsi

  • c语言字符数组与字符串的使用详解

    1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ 'I',' ','a','m',' ','h','a','p','p','y'};即把10个字符分别赋给str[0]到str[9]10个元素如果花括号中提供的字符个数大于数组长度,则按语法错误处理:若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 '\0' ). 2.字符数组与字符串在c语言中,将字符串作为字符数组来处理.(c++中不是)在实际应用

  • C语言实例问题探究字符串函数的应用

    目录 一.典型问题一 二.典型问题二 三.典型问题三 四.典型问题四 一.典型问题一 下面的程序输出什么?为什么? 分析 snprintf 函数本身是可变参数函数,原型如下:int snprintf( char* buffer, int buf_size, const char*fomart,... ) 当函数只有 3 个参数时,如果第三个参数没有包含格式化信息,函数调用没有问题:相反,如果第三个参数包含了格式化信息,但缺少后续对应参数,则程序行为不确定. 下面编程看看究竟会输出什么: #inc

  • Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页

    SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数; SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual; A A ZERO SPACE --------- --------- --------- --------- 65 97 48 32 2.CHR 给出整数,返回对应的字符; SQL> select chr(54740) zhao,chr(65) chr65 fr

  • ORACLE常用数值函数、转换函数、字符串函数

    本文更多将会介绍三思在日常中经常会用到的,或者虽然很少用到,但是感觉挺有意思的一些函数.分二类介绍,分别是: 著名函数篇 -经常用到的函数 非著名函数篇-即虽然很少用到,但某些情况下却很实用 注:N表示数字型,C表示字符型,D表示日期型,[]表示内中参数可被忽略,fmt表示格式. 单值函数在查询中返回单个值,可被应用到select,where子句,start with以及connect by 子句和having子句. (一).数值型函数(Number Functions) 数值型函数输入数字型参

随机推荐