深⼊了解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;
字符串长度函数c语言
}
输出结果:
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;
}
运⾏结果:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。