1.strcpy()

在字符串拷贝函数中,它的函数编写不难,如下

char* Strcpy(char* dest, const char* src) {

assert(dest != NULL && src != NULL);

char* result = dest;

while (*src != '\0') {

*dest = *src;

src++;

dest++;

}

*dest = '\0';

return result;

}

但是,我们要注意的是, 目标内存的空间大小能否存储下源字符串的内容,在C语言中这一点,只能通过程序员来保证,所以往后再使用此类函数时候,一定要注意这一点.

2.strstr()函数

主要用来判断两个字符串是否为父子关系,也就是说str2字符串是否为Str1字符串的子串.我们自定义的函数里面使用了红黑指针用来标记子字符串首地址.

const char* Strstr(const char* str1, const char* str2) {

//避免违法内存

assert(str1 != NULL && str2 != NULL);

if (*str2 == '\0') {

//此时说明str2是一个空字符串

return NULL;

}

const char* black = str1;

while (*black != '\0') {

const char* red = black;

const char* sub = str2;

while((*red == *sub) && *red != '\0' && *sub != '\0' ) {

//三个结束条件

//1. *red *sub不一样

//2. red到头未找到

//3. sub到头找到

red++;

sub++;

}

if (*sub == '\0') {//if顺序不可调换

return black;//sub到头,找到子字符串

}

if (*red == '\0') { //red到头没找到子字符串

return NULL;

}

black++;//继续处理下次循环匹配

}

return NULL; //到头也没找到

}

3.strcat()函数 字符串拼接函数

char* Strcat(char* dest, const char* src) {

if (dest == NULL || src == NULL) {

return NULL;

}

// 1. 先找到 dest 的结束位置

int cur = 0;

while (dest[cur] != '\0') {

cur++;

}

// 循环结束之后, cur 下标位置就是 \0

// 2. 再把 src 往 dest 的结束位置进行拷贝

int i = 0;

while (src[i] != '\0') {

dest[cur + i] = src[i];

i++;

}

// 最后的设置 \0 千万不要遗漏

dest[cur + i] = '\0';

return dest;

}

4.字符串内个数  strlen()

int Strlen(const char* str) {

assert(str != NULL);

int size = 0;

while (*str != '\0') {

size++;

str++;

}

return size;

}

5.strcmp()两字符串按照字典序比较大小

int Strcmp(const char* str1, const char* str2) {

// 针对这个函数来说, 不太好用返回值来表示出错情况

assert(str1 != NULL && str2 != NULL);

// 依次比较两个字符串对应字符是否相等

while (*str1 != '\0' && *str2 != '\0') {

if (*str1 < *str2) {

return -1;

} else if (*str1 > *str2) {

return 1;

} else {

// 当前字符难分高下

// 继续再去比较下一个字符

str1++;

str2++;

}

}

// 看是哪个字符串先到达 \0 哪个字符串就更小

if (*str1 < *str2) {

return -1;

} else if (*str1 > *str2) {

return 1;

} else {

return 0;

}

}

6.内存拷贝memcpy()

void* Memcpy(void* dest, const void* src, size_t num) {

assert(dest != NULL && src != NULL);

void* ret = dest;

for (size_t i = 0; i < num; i++) {

*(char*)dest = *(char*)src;

dest = (char*)dest + 1;

src = (char*)src + 1;

}

return ret;

}

以上的字符串函数和内存拷贝函数中,都要注意目标存储空间的大小能否容纳下源字符串或内容的大小.在C语言中这一点,只能通过程序员来保证,所以往后再使用此类函数时候,一定要注意这一点.

7.memmove()

在改良的条件下,多传入一个函数用于规避以上的内存访问越界问题中,memMove()函数能避免此类问题.

void* Memmove(void* dest, const void* src, size_t num) {

assert(dest != NULL && src != NULL);

// 先判定缓冲区内存是否重叠

char* cdest = (char*)dest;

char* csrc = (char*)src;

if (csrc < cdest && cdest < csrc + num) {

// 需要从后往前拷贝

char* pdest = cdest + num - 1; // 最后一个位置的字节

char* psrc = csrc + num - 1;

for (size_t i = 0; i < num; i++) {

*pdest = *psrc;

pdest--;

psrc--;

}

} else {

Memcpy(dest, src, num);

}

return dest;

}

此函数的功能在于,发现两个内存空间重叠时,会调换拷贝的方式为:从后往前拷贝;

如果不重叠,则按照memcpy()拷贝,

c语言中存储字符用什么函数,那些C语言中你不知道的字符串函数(坑)相关推荐

  1. (mfc)将字符串中的字符逐个按行输出_C语言中字符串输入输出

    在C语言中没有字符串类型,用字符数组处理字符串 定义 字符数组定义:char 数组名 [常量表达式][常量表达式] 一维字符数组,用于存储和处理一个字符串 . 二维字符数组,用于同时存储和处理多个字符 ...

  2. c语言限制字符数,C语言中“不受限制”的字符串函数总结.pdf

    C语语言言中中"不不受受限限制制"的的字字符符串串函函数数总总结结 "不不受受限限制制的的"字字符符串串函函数数 按 <C和指针>中所说,那些常用的 ...

  3. c语言简单密码字符a用f代替,c语言实验.doc

    c语言实验.doc 实验1 熟悉C语言的运行环境[实验目的]1. 熟悉C语言编程环境VC 6.0,掌握运行一个C程序的基本步骤,包括编辑.编译.连接和运行.2. 了解C程序的基本框架,能够编写简单的C ...

  4. c语言二进制数以字符形式输出,如何用C语言输出二进制数据

    二进制2113数字不能像小数一样直接输出为%d. 如果要输出5261二进制数printf输出格式 二进制,可以使用函数4102将其转换为二进制字符串,然后在1653中输出. itoa函数 原型: ch ...

  5. 计算机中存储数据最小的单位是什么,计算机中存储数据的最小单位和存储容量的基本单位各是什么?...

    pb呢计算机中存储数据的最小单位:位bit(比特)(BinaryDigits),存放一位二进制数,即0或1,最小的存储单位.存储容量的基本单位是:bit.B.KB.MB.GB.TB.PB.EB.ZB. ...

  6. MYSQL的函数有哪些?(3.字符串函数)

    一.字符串函数的类别及其作用 字符串函数主要用来处理字符串数据,MySQL 字符串函数主要有计算字符长度函数.字符串合并函数.字符串转换函数.字符串比较函数以及查找指定字符串位置函数等. 如下表所类 ...

  7. python rstrip函数_【C++实现python字符串函数库】strip、lstrip、rstrip方法

    [C++实现python字符串函数库]strip.lstrip.rstrip方法 这三个方法用于删除字符串首尾处指定的字符,默认删除空白符(包括'\n', '\r', '\t', ' '). s.st ...

  8. 函数、返回-Sql Server常用函数之统计、算数、字符串函数-by小雨

    新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正 统计函数 Ø  AVG(expression)函数----按列算计平均值 Ø  SUM(expression)函数----按列算计值 ...

  9. php向前截取字符串函数,ThinkPHP 模板substr的截取字符串函数详解

    ThinkPHP 模板substr的截取字符串函数 在Common/function.php加上以下代码 /** ** 截取中文字符串 **/ function msubstr($str, $star ...

最新文章

  1. 在分析了AI顶会上的6163篇论文后,我们能发现怎样的发展趋势与变化……
  2. JavaScript常用判断函数 [转]
  3. Java Magic. Part 5: SecurityManager
  4. Linux安装GitLib
  5. java 输入框输入1到9_java程序设计  习题答案1到9
  6. JDK库rt包中常用包说明
  7. matlab正余弦画心形图案
  8. 收藏 | Transformers资料汇总!从原理到应用
  9. 新概念51单片机C语言教程纠错(2)
  10. Java中常用的加密方法(JDK)
  11. java 奇数 字符乱码_socket中文奇数个出现乱码的解决办法
  12. error: R_LARCH_SOP_PUSH_PCREL against `x264_log_default‘:PLT shouldn‘t be with r_addend.
  13. 如何发布ArcGIS Server离线地图(google 瓦片)
  14. Oracle数据脱敏
  15. TikTok Shop 英国限售商品规则
  16. python中一元二次方程的判别式_【Python算法作业】解一元二次方程
  17. word2016用尾注引用参考文献
  18. Java人工弱智算法_人工智障也刷题!Kaggle 入门之实战泰坦尼克号
  19. python背单词游戏,python背单词小程序
  20. springboot 整合mybatis plus

热门文章

  1. 瞎聊Spring Cloud
  2. Day43 前端基础--html
  3. Python 2.x 与 Python 3.x 的区别
  4. Kafka High Availability (下)
  5. hadoop1.x 与hadoop2.x 架构变化分析
  6. redis中密码设置
  7. jquery笔记___返回值问题
  8. python lxml 安装及应用
  9. CentOS6.8下安装Docker
  10. 用Leangoo Scrum看板工具管理OKR-目标管理