c语言中存储字符用什么函数,那些C语言中你不知道的字符串函数(坑)
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语言中你不知道的字符串函数(坑)相关推荐
- (mfc)将字符串中的字符逐个按行输出_C语言中字符串输入输出
在C语言中没有字符串类型,用字符数组处理字符串 定义 字符数组定义:char 数组名 [常量表达式][常量表达式] 一维字符数组,用于存储和处理一个字符串 . 二维字符数组,用于同时存储和处理多个字符 ...
- c语言限制字符数,C语言中“不受限制”的字符串函数总结.pdf
C语语言言中中"不不受受限限制制"的的字字符符串串函函数数总总结结 "不不受受限限制制的的"字字符符串串函函数数 按 <C和指针>中所说,那些常用的 ...
- c语言简单密码字符a用f代替,c语言实验.doc
c语言实验.doc 实验1 熟悉C语言的运行环境[实验目的]1. 熟悉C语言编程环境VC 6.0,掌握运行一个C程序的基本步骤,包括编辑.编译.连接和运行.2. 了解C程序的基本框架,能够编写简单的C ...
- c语言二进制数以字符形式输出,如何用C语言输出二进制数据
二进制2113数字不能像小数一样直接输出为%d. 如果要输出5261二进制数printf输出格式 二进制,可以使用函数4102将其转换为二进制字符串,然后在1653中输出. itoa函数 原型: ch ...
- 计算机中存储数据最小的单位是什么,计算机中存储数据的最小单位和存储容量的基本单位各是什么?...
pb呢计算机中存储数据的最小单位:位bit(比特)(BinaryDigits),存放一位二进制数,即0或1,最小的存储单位.存储容量的基本单位是:bit.B.KB.MB.GB.TB.PB.EB.ZB. ...
- MYSQL的函数有哪些?(3.字符串函数)
一.字符串函数的类别及其作用 字符串函数主要用来处理字符串数据,MySQL 字符串函数主要有计算字符长度函数.字符串合并函数.字符串转换函数.字符串比较函数以及查找指定字符串位置函数等. 如下表所类 ...
- python rstrip函数_【C++实现python字符串函数库】strip、lstrip、rstrip方法
[C++实现python字符串函数库]strip.lstrip.rstrip方法 这三个方法用于删除字符串首尾处指定的字符,默认删除空白符(包括'\n', '\r', '\t', ' '). s.st ...
- 函数、返回-Sql Server常用函数之统计、算数、字符串函数-by小雨
新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正 统计函数 Ø AVG(expression)函数----按列算计平均值 Ø SUM(expression)函数----按列算计值 ...
- php向前截取字符串函数,ThinkPHP 模板substr的截取字符串函数详解
ThinkPHP 模板substr的截取字符串函数 在Common/function.php加上以下代码 /** ** 截取中文字符串 **/ function msubstr($str, $star ...
最新文章
- 在分析了AI顶会上的6163篇论文后,我们能发现怎样的发展趋势与变化……
- JavaScript常用判断函数 [转]
- Java Magic. Part 5: SecurityManager
- Linux安装GitLib
- java 输入框输入1到9_java程序设计 习题答案1到9
- JDK库rt包中常用包说明
- matlab正余弦画心形图案
- 收藏 | Transformers资料汇总!从原理到应用
- 新概念51单片机C语言教程纠错(2)
- Java中常用的加密方法(JDK)
- java 奇数 字符乱码_socket中文奇数个出现乱码的解决办法
- error: R_LARCH_SOP_PUSH_PCREL against `x264_log_default‘:PLT shouldn‘t be with r_addend.
- 如何发布ArcGIS Server离线地图(google 瓦片)
- Oracle数据脱敏
- TikTok Shop 英国限售商品规则
- python中一元二次方程的判别式_【Python算法作业】解一元二次方程
- word2016用尾注引用参考文献
- Java人工弱智算法_人工智障也刷题!Kaggle 入门之实战泰坦尼克号
- python背单词游戏,python背单词小程序
- springboot 整合mybatis plus