【无标题】代码练习
一、C语言
1、计算n的阶乘

2、写出代码:1!+2!+3!=?

错误示例:

阶乘求和代码常见错误分析:
变量未初始化
循环中用于存储阶乘结果的变量未赋初值,导致计算结果异常。正确做法是在循环前初始化变量:
循环范围错误
循环终止条件设置不当会导致少计算一项。例如计算1!+2!+3!时,循环应包含上限值:
阶乘计算逻辑错误
错误的阶乘累积方式会导致结果偏差。应在内层循环中重置临时变量:
结果累加位置不当
总和累加若放在内层循环中,会造成重复累加。正确位置应在外层循环末尾:
n个阶乘求和:1!+2!+3!+......+n!=?

3、在一个有序数组中查找某个具体的数字n,(用到二分查找/折半查找)

二分查找的基本概念
二分查找(Binary Search)是一种在有序数组中查找特定元素的高效算法。其核心思想是通过不断将搜索范围减半来快速定位目标值,时间复杂度为 O(log n)。
适用条件
- 数组必须是有序的(升序或降序)。
- 适用于静态数据或较少变动的数据集,因为频繁插入/删除会导致排序成本增加。
算法实现步骤
- 初始化指针:设置
low和high分别指向数组的首尾元素。 - 计算中间索引:
mid = low + (high - low) / 2(避免整数溢出)。 - 比较中间值:
- 若
arr[mid] == target,返回mid。 - 若
arr[mid] < target,调整low = mid + 1。 - 若
arr[mid] > target,调整high = mid - 1。
- 若
- 循环终止:当
low > high时结束,未找到返回 。
注意事项
- 边界条件:确保
low和high的更新正确,避免死循环。 - 整数溢出:使用
mid = low + (high - low) / 2而非(low + high) / 2。 - 重复元素:若存在重复值,返回的索引不一定是第一个或最后一个匹配项。
变体场景
- 查找第一个/最后一个匹配项:通过调整相等时的指针移动逻辑实现。
- 插入位置查找:返回
low可得到目标值应插入的位置(如力扣35题)。
复杂度分析
- 时间:O(log n),每次迭代将搜索范围减半。
- 空间:O(1),仅需常量额外空间。
4、编写代码,演示多个字符从两端移动,向中间汇聚

strlen() 函数
strlen() 是 C 语言标准库 <string.h> 中的函数,用于计算字符串的长度(不包括终止符 \0)。
参数说明
- str:指向以
\0结尾的字符串的指针。若字符串未以\0结尾,行为未定义。
返回值
- 返回
size_t类型的无符号整数,表示字符串中字符的个数(不包含\0)。
使用示例
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
size_t length = strlen(str);
printf("字符串长度: %zu\n", length); // 输出: 13
return 0;
}
注意事项
- 安全性:
strlen()不检查缓冲区溢出,需确保字符串以\0结尾。 - 性能:时间复杂度为 O(n),需遍历整个字符串。
- 与 sizeof 区别:
strlen()返回实际字符数。sizeof返回数组或变量占用的总字节数(包含\0)。
常见错误
- 未初始化的指针:
char *str; // 未初始化 printf("%zu\n", strlen(str)); // 未定义行为 - 非字符串参数:
char arr[] = {'a', 'b', 'c'}; // 缺少 \0 printf("%zu\n", strlen(arr)); // 错误Sleep(1000);//单位毫秒,1000毫秒等于一秒。
使用Sleep()函数,每间隔设定时间打印下一行
Sleep()函数要有头文件#include <windows.h>
如果直接一行码完,不再罗列很多行,使用system库函数,要有头文件#include<stdlib.h>可以执行系统命令

system 函数概述
system 是 C 标准库中的一个函数,定义在 <stdlib.h> 头文件中。其功能是执行操作系统命令,通常用于调用 shell 或其他命令行解释器来运行指定的命令。
- 参数:
command是要执行的命令字符串。若为NULL,函数会检查系统中是否存在命令处理器。 - 返回值:
- 成功时返回命令的退出状态。
- 若
command为NULL且命令处理器存在,返回非零值;否则返回 0。 - 执行失败时返回 -1。
使用示例
#include <stdlib.h>
int main() {
// 执行系统命令(例如在 Windows 下打开记事本)
system("notepad.exe");
return 0;
}
工作原理
- 命令解析:
system将command字符串传递给操作系统的命令处理器(如/bin/sh或cmd.exe)。 - 子进程创建:操作系统创建一个子进程来执行命令。
- 执行结果:子进程执行完毕后,返回状态码给调用进程。
注意事项
- 安全性风险:直接拼接用户输入作为命令参数可能导致命令注入漏洞。应避免使用未经验证的输入。
- 跨平台差异:不同操作系统的命令语法可能不同(如
dir在 Windows 和ls在 Unix 下的差异)。 - 资源开销:每次调用
system都会启动一个新的 shell 进程,频繁调用可能影响性能。
替代方案
- 特定任务:使用更专用的库函数(如文件操作优先用
fopen而非system("cat file.txt"))。 - 进程控制:如需更精细的控制,可通过
fork+exec系列函数实现。
常见用途
- 调用系统工具(如压缩、文件操作)。
- 执行脚本或批处理文件。
- 快速测试命令行功能。
5、编写代码实现模拟用户登录场景,并且只能登录三次(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序。)
比较2个字符串是否相等,不能使用==,而应该使用一个库函数: strcmp 如果返回值是0表示2个字符串相等

strcmp()函数概述
strcmp()是C语言标准库<string.h>中的字符串比较函数,用于按字典序比较两个以空字符('\0')结尾的字符串。
参数说明
str1:待比较的第一个字符串指针str2:待比较的第二个字符串指针
返回值
- 负数:
str1字典序小于str2 - 0:
str1与str2内容完全相同 - 正数:
str1字典序大于str2
比较规则
逐字符比较ASCII码值,直到遇到不相等的字符或空字符:
- 比较"apple"与"apricot"时,前三个字符相同,第四个字符'l'(108) < 'r'(114),返回负数
- 比较"hello"与"hello"时,所有字符相同且同时遇到空字符,返回0
代码示例
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "abc";
char str2[] = "abd";
int result = strcmp(str1, str2);
if (result < 0) {
printf("str1 is less than str2\n");
} else if (result == 0) {
printf("str1 equals str2\n");
} else {
printf("str1 is greater than str2\n");
}
return 0;
}
注意事项
- 参数必须为以空字符结尾的有效字符串指针
- 比较结果依赖本地字符集的ASCII值
- 不会自动处理字符串长度差异,需确保内存安全
与strncmp()的区别
strncmp()可指定比较的最大字符数,避免越界风险:
int strncmp(const char *str1, const char *str2, size_t n);
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)