1.C 库函数实现
Char * strcpy(char* s1, const char * s2)
{
Char* s=s1;
While (*s1++=*s2++);
return s1;
}
char *strncpy(char *s1, const char *s2, size_t n)
{
Char* s=s1;
While (*s++=*s2++)&&(s1-s<=n);
Return s1;
}
Int strcmp(const char* s1, const char * s2)
{
While (*s1&&*s2&&(*s1++==*s2++));
Return (*--s1)-(*--s2);
}
char *strcat(char *s1, const char *s2)
{
Char* s=s1;
For(;*s1;s1++);
while (*s1++=*s2++);
return s1=s;
}
Int *strlen(char * s)
{
For(char * s1=s;*s1;s1++);
Return s1-s;
}
static const char* strstr(const char* s1, const char* s2)
{
assert(s2 && s1);
const char* p=s1, *r=s2;
while(*p)
{
while(*p++==*r++);
if(!*--r)
return s1;
else
{
r=s2;
p=++s1;
}
}
return NULL;
}
Int substrpstn(const char* s1, const char*s2)
{
int pstn=1;
char * p=s1, *q=s2;
while (*p)
{
while (*p++==*q++);
if (*--q)
Return pstn;
Else
{
q=s2;
p=++s1;
i++;
}
}
Return 0;
}
Char* reverse(char* s1)
{
char * p=s1, *q=s1;
While (*q++);
q-=2;
while (p<q)
{
*p=*p+*q;
*q=*p-*q;
*p=*p-*q;
P++;
q++;
}
Return s1;
}
Int chkIntgtr(char c)
{
Return (c>=’0’)&&(c<=’9’)?(c-‘0’):-1;
}
Void * malloc(int size)
{
Return static_cast<void*>(new char[size]);
}
void itoa(int input, char* s)
{
Int i=input;
Char* s1=s, *s2=s;
input=(input>=0)?input:-input;
do
{
*S2++=input%10+’0’;
}while(input/10);
If (i<0)
*s2++=’-’;
s2=’/0’;
s2--;
while(s1<s2)
{
*s1=*s1+*s2;
*s2=*s1-*s2;
*s1++=*s1-*s2--;
}
}
2. 在一个函数中,如果用数组名做形参,那么编译器会把其退化为一个指针对待(即使函数声明中的形参是数组),所以sizeof结果为4,正好是一个指针的大小。所以我们在f函数中可以写:n++,而在main中m++却报错,就是这个原因,一个是指针,一个是数组,指针是变量可以修改,数组名是常量,不可以修改。
3. 两个指针指向同一数组(字符串)时,高位的指针与低位的指针相减是整数(两指针之间相差的元素个数, 当然指针的类型和数组的类型应一致)
4. 字符指针数组的大小 列数*4。
5. 内存操作规则:
【规则1】用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。
【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。
【规则3】避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。
【规则4】动态内存的申请与释放必须配对,防止内存泄漏。
【规则5】用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。
分享到:
相关推荐
C语言string库函数实现详解 本文将详细介绍C语言中的string库函数的实现,包括strlen、strcpy、strcat、strcmp、strstr、memcpy和memmove等函数的实现。这些函数都是C语言中常用的字符串操作函数, MASTERING它们...
这里简要列出几个常见的图形处理库函数: 1. **`initgraph`**: - 初始化图形环境。 2. **`getaspectratio`**: - 获取图形窗口的纵横比。 3. **`circle`** 和 **`ellipse`**: - 绘制圆形和椭圆。 4. **`...
总的来说,理解和掌握这些头文件及库函数是单片机开发中必不可少的技能,它们使得我们能够方便地与各种硬件设备交互,实现功能丰富的嵌入式系统。通过学习和使用这些资源,可以快速地在项目中集成显示、时间管理和...
例如,一个常见的微控制器如Arduino,有丰富的库支持,如“Wire”库用于I2C通信,“ShiftOut”库则专门用于位移输出,非常适合流水灯。在使用这些库时,我们首先需要包含相应的头文件,然后调用库函数来初始化和控制...
C库函数主要分为以下几个类别: 1. 输入/输出(I/O)函数:如`printf`用于格式化输出,`scanf`用于从标准输入读取数据,`fopen`和`fclose`用于文件操作等。这些函数让开发者能够与用户交互,并处理文件数据。 2. ...
Keil C51的库函数主要包括以下几类: 1. **Intrinsic Routines** - 这些函数是C51编译器内建的特殊函数,可以直接被调用。 - 例如:_crol_, _cror_等用于位循环操作的函数。 2. **标准库函数** - 这些函数与标准...
C图形库函数提供了一系列用于图形绘制的基本功能,涵盖了从简单线条到复杂多边形的各种图形操作。这些函数主要在`graphics.h`头文件中定义,是进行图形界面编程的基础工具。 ### 图形绘制基础 #### putpixel()与...
总的来说,"ege库函数实现生命游戏迭代过程"是一个结合了C语言编程、数据结构(数组)、图形界面编程和细胞自动机理论的项目。它既锻炼了编程能力,又提供了理解复杂系统动态性的机会。通过这样的实践,学习者可以...
在本实验中,我们将探讨如何使用C语言在STM32上实现8位数码管的动态扫描,而不依赖库函数。这有助于理解底层硬件操作和提高代码效率。 一、数码管工作原理 数码管,也称为七段显示器,由8个发光二极管组成,通过...
HI-TECH PICC库函数主要包含以下几个方面的内容: 1. **基本输入/输出(I/O)操作**:这些函数用于配置和控制微控制器的端口,如设置方向、读写数据以及进行中断处理。例如,`putc()` 和 `getc()` 函数用于串行通信...
例如,定时器API接口被划分为几个类别,根据IP提供的功能来区分,如基本定时器、捕获定时器、脉冲宽度调制(PWM)等。 #### 五、HAL库的实际应用 1. **初始化和配置**:HAL库提供了初始化和配置外设所需的API接口...
HAL库具有以下几个显著特点: - **多实例简单API集合**:HAL库提供了一个简单易用的API集合,用于与上层应用进行交互。 - **通用架构**:HAL库基于一个通用的架构构建,使得上层软件无需深入了解底层硬件细节即可...
在Arduino中关于通信、网络和协议方面,Arduino提供了几个专门的库,包括: - Messenger库,用于处理来自计算机的基于文本的消息; - NewSoftSerial库,为基于软件的串行通信提供了一个改进的版本; - OneWire库,...
C语言实现AES加密解密主要涉及以下几个关键步骤: 1. **密钥扩展**:AES的密钥扩展过程将用户提供的原始密钥扩展成多个轮密钥,用于后续的加密和解密过程。这个过程涉及到线性和非线性的组合运算。 2. **状态矩阵...
STK库主要由以下几个部分组成: 1. 基础库:提供基本的数据类型定义、内存管理、错误处理等功能。 2. 处理器接口库:包含针对C6678硬件特性的函数,如中断管理、时钟配置等。 3. 数学运算库:提供了浮点和定点数学...
C库函数手册通常包含以下几个部分: 1. **标准输入/输出(stdio)**:如`printf`和`scanf`,用于处理标准输入、输出和错误流,是进行基本I/O操作的基础。 2. **字符串处理(string)**:例如`strcpy`、`strcat`、`...
在C语言中实现Hilbert变换,我们可以分为以下几个步骤进行讲解。 首先,我们要理解Hilbert变换的基本概念。Hilbert变换定义为:对于一个实值函数f(t),它的Hilbert变换H[f](t)可以通过下面的公式得到: \[ H[f](t)...
STM32库函数主要分为几个部分: 1. **HAL库**(Hardware Abstraction Layer):这是ST公司推出的高级库,旨在提供与具体硬件无关的API,简化编程并提高代码可移植性。HAL库包含了大量的驱动函数,如GPIO、ADC、TIM...
在STM32的UART配置中,我们需要关注以下几个关键步骤: 1. **初始化配置**:包括波特率设置、数据位数、停止位数、校验位以及流控选项。例如,通常我们会选择9600波特率、8位数据、1位停止位、无校验位和无流控。 ...