0
点赞
收藏
分享

微信扫一扫

字符和字符串函数

字符和字符串的库函数的使用和注意事项

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

前言

C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在​常量字符串(以首元素地址的形式存储)中或者字符数组​中。字符串常量适用于那些对它不做修改的字符串函数。​字符串在存储上类似字符数组,所以它每一位的单个元素都是可以提取的,在存储时是把首元素的地址存进去,而不是把整个字符串存储进去。如s=“abcdefghij”,则s[1]=“b”,s[9]="j"。

函数介绍

strlen

size_t strlen ( const char * str );
  • 字符串是以\0为结束标志的,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
  • 注意函数的返回值类型为size_t,是无符号的。size_t=unsigned int;
#include <stdio.h>
int main()
{
const char*str1 = "abcdef";
const char*str2 = "bbb";
if(strlen(str2)-strlen(str1)>0)
{
printf("str2>str1\n");
}
else
{
printf("srt1>str2\n");
}
return 0;
}

在该程序中str2、str1的返回值都是unsigned int类型的 ,两个unsigned int相减依然还是无符号数,结果>0

strcpy

char* strcpy(char * destination, const char * source );
  • 源字符串必须以 '\0' 结束,同时会将源字符串中的 '\0' 拷贝到目标空间。例如下图arr2的 b i t \0全部拷贝到arr1中。

字符和字符串函数_#include字符和字符串函数_#include_02

  • 目标空间必须足够大,以确保能存放源字符串。
  • 头文件名 string.h
//模拟实现strcpy函数
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* des,const char* sor)
{
//首先保证指针的有效性
assert(des !=NULL);
assert(sor !=NULL);

//拷贝sour指定的字符空间到des,包括'\0'
while (*des ++ = *sor ++)
{
;
}
return des;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "bit";
my_strcpy(arr1,arr2);
printf("%s\n",arr1);
return 0;
}

strcat

char * strcat ( char * destination, const char * source );//追加/一个字符串
  • 源字符串必须以 '\0' 结束。
  • 目标空间必须有足够的大,能容纳下源字符串的内容。
  • 目标空间必须可修改。头文件名 string.h

可以看到arr2在追加到arr1的时候,是从arr1的\0开始追加并替换掉,并且要保证被追加字符串的空间足够大

字符和字符串函数_#include_03字符和字符串函数_字符串_04

//模拟实现strcat函数
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* des,const char* sor)
{
//首先保证指针的有效性
assert(des !=NULL);
assert(sor !=NULL);
//找到目的字符串的\0
while (*des != '\0')
{
des++;
}
//拷贝sour指定的字符空间到des,包括'\0'
while (*des ++ = *sor ++)
{
;
}
return des;
}
int main()
{
char arr1[20] = "abcdef";
char arr2[] = "bit";
strcat(arr1,arr2);
printf("%s\n",arr1);
return 0;
}

strcmp

int strcmp ( const char * str1, const char * str2 );
  • 此函数开始比较每个字符串的第一个字符,如果它们彼此相等,则继续比对,直到字符不同或到达终止空字符。
  • 第一个字符串的对应字符大于第二个字符串的对应字符,则返回大于0的数字
  • 第一个字符串的对应字符等于第二个字符串的对应字符,则返回0
  • 第一个字符串的对应字符小于第二个字符串的对应字符,则返回小于0的数字
//模拟实现strcmp函数
#include <stdio.h>
#include <assert.h>

int my_strcmp(const char* str1, const char* str2)
{
//首先保证指针的有效性
assert(str1 != NULL);
assert(str2 != NULL);
while (*str1 ==*str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
return (*str1-*str2);
}

int main()
{
char* arr1 = "abcdef";
char* arr2 = "abcd";
int ret=my_strcmp(arr1,arr2);
printf("%d\n",ret);
return 0;
}

strncpy

char * strncpy ( char * destination, const char * source, size_t num );
  • 拷贝num个字符从源字符串到目标空间。
  • 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,​直到num个​。

字符和字符串函数_字符串函数_05字符和字符串函数_字符串函数_06

strncat

char * strncat ( char * destination, const char * source, size_t num );

首先拷贝字符串到str1和str2中,然后在str1的\0处开始追加str2。注意当str2的字符数不超过num数,则后面补齐一个\0,并不会补齐到num个数。这一点与strncpy有区别。

字符和字符串函数_字符串_07字符和字符串函数_字符串函数_08

strncmp

int strncmp ( const char * str1, const char * str2, size_t num );
  • 比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完

strstr

char * strstr ( const char *, const char * );



举报

相关推荐

0 条评论