嵌入式八股文代码编写之C++
strlen函数#include bits/stdc.h using namespace std; // 自己实现的求字符串长度函数 int mystrlen(const char *str) { assert(str ! NULL); // 检查指针是否为空 int len 0; while ((*str) ! \0) { // 只要不是结束符就继续 //*str取当前字符 *str指针向后移动一位 //! \0字符串结束符字符串最后一定有这个 len; // 长度1 } return len; } // 主函数 int main(void) { const char a[] 963852; // 字符串 int ret mystrlen(a); // 调用自己写的函数 cout ret endl; // 输出结果6 return 0; }strcpy函数#include bits/stdc.h #include cassert // 记得加 assert 的头文件 using namespace std; // ✅ 1. 函数必须写返回值类型 char* char* mystrcpy(char *dest, const char *src) { assert(dest src); // 检查两个指针都不为空 char *ret dest; // ✅ 保存起始地址绝不多余 // ✅ 2. 循环体可以是空语句但分号要写对 while((*dest *src) ! \0); return ret; // 返回起始地址 } int main(void) { // ✅ 3. main 函数要加左花括号 { const char a[] 963852; // ✅ 4. 要加分号 ; char b[10] ; // ✅ 5. 用英文引号 不是中文冒号 char* ret mystrcpy(b, a); cout ret endl; // 输出 963852 return 0; } // ✅ 6. 要加右花括号 }dest在while((*dest *src) ! \0)里被移走了必须提前备份起始地址 retstrcmp函数#include bits/stdc.h #include cassert using namespace std; // 自己实现的 strcmp 函数 int strcmp(const char* str1, const char* str2) { // ✅ 1. 补返回值 int修正 strl 为 str1 assert(str1 str2); // 检查两个指针都不为空 int ret 0; // ✅ 2. 核心循环逐字符比较 // 逻辑如果 (ret差) 为 0 且 当前字符不是 \0就继续往后比 while (!(ret *(unsigned char*)str1 - *(unsigned char*)str2) *str1) { str1; str2; } // ✅ 3. 根据 ret 返回结果 if (ret 0) return 1; else if (ret 0) return -1; // ✅ 4. 修正 -l 为 -1 return 0; // ✅ 5. 修正冒号为分号 } int main(void) { const char a[] 963852; const char b[] 963852; const char c[] 963853; cout strcmp(a, b) endl; // 输出 0 (相等) cout strcmp(a, c) endl; // 输出 -1 (a c) cout strcmp(c, a) endl; // 输出 1 (c a) return 0; }为什么要转unsigned char*因为char在某些编译器里默认是signed有符号的如果字符的 ASCII 码大于 127比如中文会变成负数减法结果就错了。转成unsigned char保证所有字符都是非负的比较结果才正确。strstr函数#include bits/stdc.h #include cassert #include cstring // 记得加 strlen 的头文件 using namespace std; // 自己实现的 strstr 函数在 str 中查找 substr 第一次出现的位置 // 返回值找到返回起始下标没找到返回 -1 int strstr(const char *str, const char *substr) { assert(str substr); // 检查指针不为空 int lenstr strlen(str); // 主串长度 int lensub strlen(substr); // 子串长度 // 如果主串比子串短直接返回 -1 if (lenstr lensub) return -1; int i, j; // ✅ 1. 去掉 for 里重复的 int i // ✅ 2. 外层循环主串的起始位置 i // i 最多走到 lenstr - lensub否则后面不够放子串 for (i 0; i lenstr - lensub; i) { // ✅ 3. 内层循环从 i 开始逐字符匹配 for (j 0; j lensub; j) { // ✅ 4. 修正substr[i] - substr[j] if (str[i j] ! substr[j]) break; // 一旦发现不匹配跳出内层循环 } // ✅ 5. 内层循环结束后判断如果 j 走完了子串说明完全匹配 if (j lensub) return i; // 返回主串中匹配的起始下标 } // ✅ 6. 外层循环走完都没找到返回 -1 return -1; } int main(void) { const char str[] hello 963852 world; const char substr1[] 963852; const char substr2[] 8888; cout 在 str 中找 \963852\: 下标 strstr(str, substr1) endl; // 输出 6 cout 在 str 中找 \8888\: 下标 strstr(str, substr2) endl; // 输出 -1 return 0; }交换两变量之值1.宏定义类型#define swap(x, y)\ xxy;\ yx-y;\ xx-y //缺点1.整数溢出 2.不能处理 “同一个变量” //3.如果参数是带副作用的表达式如 a、func()会被执行多次导致逻辑混乱。 //4.不能用于浮点数2.指针类型void swap(int *a, int *b) { *a *a *b; *b *a - *b; *a *a - *b; }void swap(int *a, int *b) { *a *a ^ *b; *b *a ^ *b; *a *a ^ *b; }指定位置清零给定一个整型变量a写两段代码第一个设置a的bit3第二个清除a的bit3。#define BIT(0x1 3) static int a; void set_bit3(void) { a | BIT3; } void clear_bit3(void) { a ~BIT3; }指定位反转在一个多任务嵌入式系统中有一个CPU可直接寻址的32位寄存器REGn地址为0x1F000010编写个安全的函数将寄存器REGn的指定位反转?指定位反转用异或^由于是寄存器地址因此强制类型转换的时候要加上volatilevoid bit_reverse(uint32_t nbit) { *((volatile unsigned int *) 0x1f000010) ^ (0x01 bit); }死循环的实现方式while(1) {//循环体语句} for(;;) {//循环体语句} do {//循环体语句}while(1); void loop() { //循环体语句 loop(); } int main() { loop(); return 0; } loop: //循环体语句 goto loop;