计算机107编译原理课程设计.doc_第1页
计算机107编译原理课程设计.doc_第2页
计算机107编译原理课程设计.doc_第3页
计算机107编译原理课程设计.doc_第4页
计算机107编译原理课程设计.doc_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

淮淮阴阴工工学学院院 编译原理课程设计指导书编译原理课程设计指导书 王文豪王文豪 江苏江苏 淮阴工学院淮阴工学院 计算机工程系计算机工程系 二二 OO 九年三月九年三月 前前言言 编译原理 是计算机科学与技术专业最重要的一门专业基础课程 内容庞大 涉及面广 知识点多 由于该课程教 学难度都非常大 往往费了大量时间而达不到 预期教学效果俗语说 学习的最好方法是实践 本课程设计正是基于此 力求为学生 提供一个理论联系实际的机会 通过布置一定难度的课题 要求学生独立完成 通过 实践 建立系统设计的整体思想 锻炼编写程序 调试程序的能力 学习文档编写规 范 培养独立学习 吸取他人经验 探索前言知识的习惯 树立团队协作精神 同时 课程设计可以充分弥补课堂教学及普通实验中知识深度与广度有限的缺陷 更好地帮 助学生从全局角度把握课程体系 本指导书在全面把握教学大纲及教材精神的基础上 共设计了 6 个题目 不是用 一个独立的例子涵盖这些知识点 而是按层次逐步深入 为了使学生理解它们之间如 何相互配合 设计要求使用接近实际需要的方式编程 重点放在编译程序的基本特征 上 结合实际应用 通过详细的实例 循序渐进地启发学生完成设计 课程设计比教 学实验复杂 涉及的深度较广 并更加实用 目的是通过课程设计的综合训练 培养 学生实际分析问题 编程和动手能力 最终目标是通过课程设计的形式 帮助学生系 统地掌握该门课程的主要内容 更好地完成教学任务 书中给出的实例概念清楚 体 系完整 内容丰富 采用循序渐进的方式 提高学生实际动手能力 完成 知识 实 践 技能 的整个学习过程 目目 录录 前 言2 选题一 有穷自动机的化简与确定化4 选题二 LL 1 语法分析5 选题三 算符优先分析法7 选题四 LR 0 语法分析8 选题五 SLR 1 语法分析9 选题六 逆波兰式的生成10 附录 A VISUAL C 6 0 简介11 附录 B C C 常用函数26 附录 C 课程设计操作规程61 附录 D 文档要求与规范64 选题一选题一有穷自动机的化简与确定化有穷自动机的化简与确定化 一 设计内容及要求一 设计内容及要求 1 可以使用任何语言来完成 例如 C C 2 以文件方式读取自动机 3 判断读取的自动机是确定的还是不确定的自动机 4 若是不确定的自动机 将自动机确定化 5 将确定化后的自动机最小化 6 输入测试字符串 输出测试结果 二 实现原理二 实现原理 1 确定化 子集法 1 置 Q F 为空集 2 令 q0 CLOSURE q0 并把 q0 置为未标记后加入到 Q 中 3 如果 Q 中存在未标记状态 q1 q2 qi 则对每个 a 定义 d q1 q2 qi a p1 p2 pj 当且仅当 d q1 q2 qi a r1 r2 rk CLOSURE r1 r2 rk p1 p2 pj 如果 p1 p2 pj 不在 Q 中 则把它置为未标记后加入到 Q 中 如果 p1 p2 pj 中至少有一个是 M 的 终态 则同时把 p1 p2 pj 加入到 F 中 然后给 Q 中的状态 q1 q2 qi 加上标记 4 重复执行 3 直到不能向 Q 中加入新状态 并且 Q 中所有的状态都有标记为止 5 重新命名 Q 中的状态 然后获得等价的 DFA M 2 DFA 的最小化 利用等价关系找出状态集 Q 上的所有最大等价状态子集 即找出 Q 的最小划分 然后从各个 等价子集中选取一个代表状态 消去各等价子集中的非代表状态 这样就实现了 DFA 的最小化的 目的 主要步骤 for v q p F Q F do 标记可区分状态表中的表项 q p p 和 q 不可合并 for v q p F F Q F Q F 且 q p do if E a 可区分状态表中的表项 q a p a 已被标记 then begin 标记可区分状态表中的表项 q p 递归的标记本次被标记的状态对的关联链表上的各个状态对在可区分状态表中 的对应表项 end else for v a do if q a p a 且与 q p 与 q a p a 不是同一个状态对 then 将 q p 放在 q a p a 的关联链表上 选题二选题二 LL 1 语法分析 语法分析 一 设计内容及要求一 设计内容及要求 1 一切 LL 1 文法 含有直接左递归但可以转化为 LL 1 文法的文法 含有间接左递归但可 以转化为 LL 1 文法的文法 2 计算出文法的 First Follow 3 构造相应文法的预测分析表 4 对某个输入句子进行分析 二 实现原理二 实现原理 1 LL 1 文法 LL 1 文法是一类可以进行确定的自顶向下语法分析的文法 就是要求描述语言的文法是无左 递归的和无回溯的 根据 LL 1 文法的定义 对于同一非终结符 A 的任意两个产生式 A a 和 A b 都要满足 SELECT A a SELECT A b 1 文法的左递归 当一个文法是左递归文法时 采用自顶向下分析法会使分析过程进入无穷循环之中 所以采 用自顶向下语法分析需要消除文法的左递归性 文法的左递归是指若文法中对任一非终结符 A 有 推导 A A 则称该文法是左递归的 左递归又可以分为直接左递归和间接左递归 直接左递归 若文法中的某一产生式形如 A A V 则称该文法是直接左递归的 消除直接左递归的方法 设有产生式是关于非终结符 A 的直接左递归 A A V 且 不以 A 开头 对 A 引入一个新的非终结符 A 把上式改写为 A A A A 间接左递归 若文法中存在某一非终结符 A 使得 A A 至少需要两步推导 则称该文法是间接左递归的 消除间接左递归的方法 方法一 采用代入法把间接左递归变成直接左递归 方法二 直接改写文法 设有文法 G10 S S A A S 因为 S A S 所以 S 是一个间接递归的非终结符 为了消除这种间接左递归 将 式代入 式 即可得到与原文法等价的文法 可以证明 S S 式是直接左递归的 可以采用前面介绍的消除直接左递归的方法 对文法进行改写后可得 文法 S S S S 2 计算 First 集 1 若 X VT 则 First X X 2 若 X VN 且有产生式 X a a VT则 First X X 3 若 X VN 且有产生式 X 则 First X X 4 若 X Y1 Y2 Yn 都 VN 而由产生式 X Y1 Y2 Yn 当 Y1 Y2 Yi 1 都能推导出 时 其中 1 i n 则 First Y1 First Y2 First Yi 都包含在 First X 中 5 当 4 中所有 Yi都能推导出 i 1 2 n 则 First X First Y1 First Y2 First Yn 反复使用上述步骤直到每个符合的 First 集合不再增大为止 3 计算 Follow 集 对文法中的每个 A VN 计算 Follw A 1 设 S 为文法的开始符合 把 加入 Follow S 中 2 若 A B 是一个产生式 则把 First 的非空元素加入 Follow B 中 如果 能推导 出 则把 Follow A 也加入 B 中 3 反复使用以上步骤直到每个非终结符号的 Follow 集不再增大为止 4 预测分析方法 预测分析方法是自顶向下分析的另一种方法 一个预测分析器是由三个部分组成 预测分析 程序 先进后出栈 预测分析表 预 测分析 程序的 框图如 下 选题三选题三算符优先分析法算符优先分析法 一 实验内容与要求一 实验内容与要求 已知文法 E E T E T T T T F T F F F E i E i d 其中 d 表示 0 9 的数字 i 表示字母 大小写均包含 根据算符优先分析法 将表达式进行语法分析 判断一个表达式是否正确 1 可以使用任何语言来完成 例如 Java C 2 构造此文法的分析过程 3 输入测试字符串 输出测试结果 二 实验原理二 实验原理 1 算符优先分析算法算法原理 1 初始化栈 k 1 S k 2 依次从输入串中读入符号 a 当前单词若为标识符 则 a 值为 i 若为常数则 a 值为 d 其它 a 直接取单词值 若 a 大于等于栈顶第一个终结符的优先级 则 a 进栈 若 a 小于栈顶第一个终结符的优先级 则重复做 i 找出最左子串 S j S j 1 S k a ii 把 S j 1 S k 归约为某个 N iii 将归约后的非终结符 N 入栈 出错处理 若输入串扫描完毕 且栈中呈现 S 且 a 为 则符合语法要求 否则就不符合语法要 求 选题四选题四LR 0 语法分析语法分析 一 实验内容与要求一 实验内容与要求 1 录入合法的 LR 0 文法 2 将输出 LR 0 分析表 3 可以对输入的句子进行语法分析 二 实验原理二 实验原理 1 LR 分析表的构造 1 若 A a Ik 且 GO Ik a Ij a VT 则置 ACTION k a sj 2 若 A Ik 则对任意终结符 a 包括 置 ACTION k a rj j 为产生式 A 的编 号 3 若项目 S S Ik 则置 ACTION k acc 4 若 GO Ik A Ij A VN 则置 GOTO k A j 5 不能用上述方法填入内容的单元均置为 出错标志 用空白表示 2 LR 分析算法描述 将 S0 移进状态栈 移进符号栈 S 为状态栈栈顶状态 a getsym 读入第一个符号给 a while ACTION S a acc if ACTION S a Si PUSH i a 分别进栈 a getsym 读入下一个符号给 a else if ACTION S a rj 第 j 条产生式为 A 将状态栈和符号栈分别弹出 项 push A 将 GOTO S A 移进状态栈 S 为当前栈顶状态 else error 选题五选题五SLR 1 语法分析语法分析 一 实验内容与要求一 实验内容与要求 已知控制语句 算术表达式 布尔表达式的文法如下 1 控制语句控制语句 1 S if e S else S 2 S while e S 3 S L 4 S a 5 L S 6 L SL 2 算术表达式算术表达式 1 E E E 2 E E E 3 E E 4 E i 3 布尔表达式布尔表达式的 SLR 分析表 3 设计如下 过程略 1 B i 2 B i rop i 3 B B 4 B B 5 A B 另一种仍是程序设计上的错误 但是躲过了编译程序和连接程序的检查 通常表现为突 然死机 自行热启动或者输出信息混乱 相对于编译和连接错误来说 运行错误的查找和判断更为困难 编译和连接错误可以由编译 程序和连接程序检查 而运行错误就不同了 很少或根本没有提示信息 只能靠程序员的经验来判 断错误的性质和位置 下面简单地介绍一些常见运行错误的调试方法 逻辑错误 一种逻辑错误是由于在设计程序的算法时考虑欠周引起的 例如对边界和极端条件 未作处理等 例如以下循环 while count count count 1 程序员的构思是进行 count 次循环 但是 如果 count 中原来的值为负数时 此循环就成了一 个 死循环 而导致无法停机 显然是错误的 但是编译程序无法查出这类错误 只有到了程序运行 之后才有可能发现 再如 在利用海伦公式计算三角型面积时 首先应该确认给出的三条边长确实 可以构成一个三角形 否则计算结果是没有意义的 而在编写求解一般实系数一元二次方程的程序 时 必须在程序中设计处理复根情况的程序段 以免对负数求平方根 另一种常见的逻辑错误是由于程序输入时的打字错误造成的 例如将判断条件中的 误输 入为 将相等判断 误输入为赋值号 等 含有这类错误的程序在运行时出现的现象多种多 样 而且通常很难与错误的原因联系起来 数组下标越界错误 即使用了并不存在的数组元素 例如有程序段 int a 5 for int i 1 i 5 i a i 0 由于 5 并不存在 而上述程序段试图将数据存放到一个并不存在的数组元素中 这会引起包 括死机在内的严重运行错误 类似错误还有指针和动态存储分配引起的一些运行错误 A 8 基本调试手段基本调试手段 程序的基本调试手段有以下几种 标准数据检验 程序跟踪 边界检查和简化循环次数等 标准数据检验标准数据检验 在程序编译 连接通过以后 就进入了运行调试阶段 运行调试的第一步就是 用若干组已知结果的标准数据对程序进行检验 标准数据的选择非常重要 一是要有代表性 接近 实际数据 二是要比较简洁 容易对其结果的正确性进行分析 另外 对重要的临界数据也必须进 行检验 程序跟踪程序跟踪 对于比较复杂的大型程序来说 上述标准数据检验一次就完全通过的可能性很小 通常程序中总是存在许多各种各样的错误 还需要对程序进行细致的调试工作 程序跟踪则是最重 要的调试手段 程序跟踪的基本原理是让程序一句一句地执行 通过观察和分析程序执行的过程 中数据和程序执行流程的变化来查找错误 就 Visual C 而言 程序跟踪可以采用两种方法 一种 是直接利用 Developer Studio 中的分步执行 断点设置 变量内容显示等功能对程序进行跟踪 这 种方法在后面的编程与调试部分介绍 另一种是传统的方法 通过在程序中直接设置断点 打印重 要变量内容等来掌握程序的运行情况 例如 可以在程序中的关键部位插入这样的代码段 调试代码段 cout 100 endl cout Variable count count x x sum sum endl getch 调试代码段结束 其中的变量可以根据程序的实际情况进行设计 使用 getch 函数的目的是要程序在执行到 这一行时暂时停下来 从而可以看清楚调试代码段所显示的信息 然后选择是否让程序继续执行 该函数的原型在头文件 conio h 中 如果到这一断点时尚未发现错误 则可以按下任何一个键让程 序继续运行到下一个断点 否则可以使用组合键 Ctrl Break 键来中断程序 再使用编辑器对程序进 行修改 在程序中的所有的问题都解决了之后 再将程序中所有的调试代码段统统删去 边界检查 在设计检查用的数据时 要重点检查边界和特殊情况 例如 对于循环 while count a b c 这样的程序时 为了突出测试该段程序对某组输入数据 如 a 1 b 2 c 3 的响应情况 同时避免每次输入数据的麻烦 可以利用注解号将上述程序段落改为 cin a b c a 1 b 2 c 3 这样在调试程序时就不必每次停下来等待输入数据了 可以直接使用步进 跟踪或设置断点 等手段调试这段程序 等到程序中的所有错误全部修正以后 再恢复被修改的内容 即注解中的 内容 即可 A 10 条件编译条件编译 条件编译是编译预处理命令的一种 用于对源程序的内容进行选择性编译 例如 在调试程 序期间 常常希望记录输出一些调试用的信息 而在调试完成后 就不再需要这些输出信息了 要 解决这个问题 一种办法是逐一从源程序中删去这些输出这些调试信息的程序段落 或者将这些 程序段落用注释标记括起来 显然这样很不方便 另一种方法就是使用编译预处理中的条件编译 命令 条件编译命令的格式为 if elif elif else endif 条件编译中所使用的条件只能是由常数构成的表达式 如果该常数表达式的值不为 0 就表示 条件成立 否则表示条件不成立 一般情况下 在 if 中都是使用由 define 指令产生的符号常数进 行测试 编译预处理命令的一个常见的用途是将调试代码插入应用程序中 程序员可以定义一个叫做 DEBUG 的符号常数 值可以定义为 1 或者 0 在程序中的任何地方 都可用以下方式插入调试信息 if DEBUG 1 endif 在开发程序时 将 DEBUG 定义为 1 则插入的调试代码被编译进目标程序 可输出帮助跟踪 错误的信息 一旦程序工作正常 就可将 DEBUG 重新定义为 0 后再次编译程序 即可从目标程序 中去掉调试代码 中还有两个和 if 类似的条件编译命令 ifdef 和 ifndef 例如 ifdef DEBUG 则只要定义了 DEBUG 无论将 DEBUG 定义为什么值 包括 0 甚至什么具体值也不是 define DEBUG 则上述条件成立 而在前面没有定义 DEBUG 时 ifndef DEBUG 成立 A 11 Developer Studio 的跟踪调试功能的跟踪调试功能 调试器是 Developer Studio 中最出色的部件之一 可以帮助找到在软件开发中可能遇到的几乎 每个错误 调试器的主要调试手段有设置断点 跟踪和观察 所谓断点 即程序中的某处 在调试时使 程序执行到断点处停下来 通过观察程序变量 表达式 调试输出信息 内存 寄存器和堆栈的 值来了解程序的运行情况 或进一步跟踪程序的运行 在当前编辑位置设置一个断点最直接的方式是使用快捷键 F9 或用鼠标点击 Build MiniBar 工 具条上的手形图标 断点用编辑窗口左边框上的大红圆点表示 非常醒目 取消一个断点的方法 类似 只要在有断点的语句上重新使用快捷键 F9 即可取消已设置的断点 如果已设置好了断点 则可通过子菜单 Build Start Debug 调用调试器 该子菜单有 4 个选项 分别为 A Go 快捷键为 F5 从当前语句开始执行程序 直到遇到一个断点或程序结束 用 Go 命令启动调试器时 从头开始执行程序 B Step Into 快捷键为 F11 单步执行每一程序行 遇到函数时进入函数体内单步执 行 C Run To Cursor 快捷键为 Ctrl F10 运行程序至当前编辑位置 D Attach To Process 将调试器与当前运行的其中某个进程联系起来 这样就可以跟踪 进入进程内部 就象调试项目工作区中当前打开的应用程序一样调试运行中的进程 当被调试的程序停在某个断点上时 编辑器左边框上的对应位置会出现一个黄色箭头指示被 中断的语句 此时 Developer Studio 的版面布置会一些发生变化 如菜单栏中以调试 Debug 菜 单项代替了建立 Build 菜单项并出现了一 Debug 工具栏 调试工具栏如图 A 9 所示 图图 A 9 Developer Studio 的的 Debug 工具栏工具栏 Debug 工具栏可分为 4 个区 第 1 2 两个区中是常用的调试命令 包括 1 Restart 快捷键 Ctrl Shift F5 终止当前的调试过程 重新开始执行程序 停在程 序的第 1 条语句处 2 Stop Debugging 快捷键 Shift F5 退出调试器 同时结束调试过程和程序运行过程 3 Break Execution 终止程序运行 进入调试状态 多用于终止一个进入死循环的程序 4 Apply Code Changes 快捷键 Alt F10 当源程序在调试过程中发生改变 重新进行 编译 5 Show Next Statement 快捷键 Alt Num 显示下一语句 6 Step Into 快捷键 F11 跟踪 如果是一语句 则单步执行 如果是一函数调用 则 跟踪到函数第一条可执行语句 7 Step Over 快捷键 F10 单步执行 如果是一语句 则单步执行 如果是一函数调用 将此函数一次执行完毕 运行到下一条可执行语句 8 Step Out 快捷键 Shift F11 从函数体内运行到外 即从当前位置运行到调用该函 数语句的下一条语句 9 Run To Cursor 快捷键 Ctrl F10 从当前位置运行到编辑光标 第 3 区有一个眼镜图标 Quick Watch 快捷键为 Shift F9 用于弹出一个对话框 观察当前 编辑位置的变量的值 第 4 区有 6 个图标 分别用于激活 6 个调试器窗口 1 观察窗口 Watch 用于观察指定变量或表达式的值 可任意添加要观察的变量或表达 式 并可用标签的形式 Watch1 Watch2 Watch3 等 增加多组观察对象 2 变量窗口 Variables 用于观察断点处或其附近的变量的当前值 Variables 有 3 个标签 Auto 标签显示变量和函数返回值 Locals 标签显示当前函数的局部变量 this 标签显示 this 指针 对象 3 寄存器窗口 Register 用于观察在当前运行点的寄存器的内容 4 内存窗口 Memory 用于观察指定内存地址内容 5 调用栈窗口 Call Stack 用于观察调用栈中还未返回的被调用函数列表 调用栈给出从 嵌套函数调用一直到断点位置的执行路径 6 汇编代码窗口 Disassmbly 用于显示被编译代码的汇编语言形式 A 12 如何在程序中使用如何在程序中使用 MFC 类库类库 如果要在程序中使用 CString CTime 和 CTimeSpan 等 MFC 类 要在程序首部加上文件包含 命令 include 此外 还需在 Developer Studio 的菜单选项 project Settings 的 General 选项卡设置 Microsoft Foundation Classes 项 可选项有三种 分别为 Not Using MFC 不使用 MFC Use MFC in a Shared DLL 以动态链接库方式用 MFC 和 Use MFC in a Static Library 以静态库方法使用 MFC 后两种选项均可使用 A 13 使用使用 FileView 标签标签 FileView 标签用于显示当前项目中各项目之间的包含关系和项目中包含的所有文件 扩展顶 层文件夹就可以显示项目的所有文件 如图 A 10 所示 图图 A 10 FileView 标签标签 FileView 的操作功能 1 定位 双击某个文件名或图标就可以打开相应的源程序编辑窗口 2 添加文件 在项目中增加一个文件有多种方法 可以通过 VC 的菜单选项 Project Add Project 也可以在文件列表上单击鼠标右键调出快捷菜单来增加一个文件 3 删除文件 用鼠标在 FileView 列表中选择要去掉的文件 按删除键 Del 就会把这个文 件从项目列表中去掉 A 14 使用使用 ClassView 标签标签 默认情况下 当用户打开 个包含有 C 类定义的工程时 ClassView 窗口将作为工程工作空 间的一部分出现 如图 A 11 所示 C1assView 显示代表类和类成员的图标和名称 通过 ClassView 标签可以使成员函数 变量的定位和增加类 类的成员的工作变得较为容易 图图 A 11 ClassView 标签标签 单击 ClassView 标签 就会在列表框中列出当前开发项目中所包含的类 用鼠标单击 会打 开各子项目 单击 会关闭打开的子项 通过该标签可以浏览类的成员 每个成员的左边都有一 个或多个图标 这些图标表示该成员是数据成员还是成员函数 以及成员的访问类型等 如果成 员是保护成员 那么它的左边会有一个钥匙图标 如果它是私有成员 那么它的左边会有一个锁 头图标 ClassView 的操作功能 1 直接定位到代码处 通过双击某个类或成员 可以在源代码窗口查看相应的源代码 2 创建新的类 在最高一级的列表项目标题上 如图 A 11 中 vc0805 Classes 处 单击鼠标右 键 调出操作菜单 在菜单中选择 New Class 就会进入图 A 12 所示的对话框 增加的类可以分 为两种 种是 MFC 继承类 它从 VC 中已有的一些 MFC 类继承而来 另一种是 般的 C 类 图图 A 12 增加一般类对话框增加一般类对话框 在图 A 12 增加类的对话框中从 Class Type 中选择 Generic Class 选项 单击 Change 按钮可 以修改输入类的头文件和源文件 在 Base Class es 组合框中输入继承的基类的名称和继承时的类 型 在 Name 编辑框中输人类的名称 按 OK 按钮就可以实现增加一般类的工作 3 添加类的成员 这些成员包括数据成员 成员函数 以及可重载的虚函数等 1 添加数据成员 在需要增加数据成员的类上单击鼠标右键 就会弹出一个选择菜单 选 择 Add Member Variable 弹出图 A 13 所示的对话框来增加数据成员 图图 A 13 增加类的数据成员对话框增加类的数据成员对话框 在 Variable Type 编辑框中输入变量的类型 如 int float char 等 在 Variable Declaration 编 辑框中输人变量的名称 通过按钮选择变量的访问属性即 公有类型 保护类型 私有类型 按 OK 按钮就会完成增加数据成员的工作 2 添加成员函数 在需要增加成员函数的类上单击鼠标右键 在弹出的选择菜单上选择 Add Member Function 就会进入图 A 14 所示的对话框来增加成员函数 成员函数的增加方法与成 员变量类似 增加完毕后 会在类的定义中增加函数的定义 在源文件中增加一个空函数 图图 A 14 增加类的成员函数对话框增加类的成员函数对话框 附录附录 B C C 常用函数常用函数 在使用 C 语言进行编程时 许多很基本和很重要的功能都由系统的库函数和类库来实现 为便于学习和使用 本附录列出了一些常用的库函数 供读者查阅 B 1 缓冲区操作函数缓冲区操作函数 函数名函数名 memccpy 函数原型函数原型 void memccpy void dest const void src int c unsigned int count 参数参数 dest 目的指针 sro 源指针 c 拷贝的最后字符 count 字符个数 所需头文件所需头文件 或 功能功能 从 src 所指向的地址开始拷贝 个或多个字节到 dest 中 当指定字符 c 已拷贝或已拷贝 count 个字节后停止 返回值返回值 如果字符 c 被拷贝 返回 dest 中该字符直接后继字节的指针 如果 c 没有被拷贝则返回 NULL 函数名函数名 memchr 函数原型函数原型 void memchr const void buf int c sizet count 参数参数 buf 缓冲区的指针 c 查找的字符 count 检查的字符个数 所需头文件所需头文件 或 功能功能 查找 buf 的前 count 个字节中 c 的第一次出现 当找到 c 或已检查完 count 个字节时停止 返回值返回值 如果成功 返回 buf 中 c 首次出现的位置的指针 否则返回 NULL 函数名函数名 memcpy 函数原型函数原型 void memcpy void dest const void src sizet count 参数参数 dest 目的缓冲区 src 源缓冲区 count 拷贝的字符个数 所需头文件所需头文件 或 功能功能 从 sro 拷贝 count 个字节到 dest 如果源缓冲区和目的缓冲区重叠 这个函数不能保证正确 拷贝 对于这种情况可使用 memmove 处理 返回值返回值 返回 dest 的值 函数名函数名 memlcmp 函数原型函数原型 int memicmp const void buf1 const void buf2 unsigned int count 参数参数 bufl 第一个缓冲区 buf2 第二个缓冲区 count 字符个数 所需头文件所需头文件 或 功能功能 比较两个缓冲区 bufl 和 buf2 的前 count 个字符 比较过程是大小写无关的 返回值返回值 bufl 和 buf2 的前 count 个字节之间的关系 0 bufl 大于 bur2 函数名函数名 memmove 函数原型函数原型 void memmove void dest const void src sizet count 参数参数 dest 目的对象 src 源对象 count 拷贝的字符字节个数 所需头文件所需头文件 功能功能 从 src 拷贝 count 个字节到 dest 如果源区域与目的区域有重叠 memmove 也能确保正确拷 贝 返回值返回值 返回 dest 的值 函数名函数名 memset 函数原型函数原型 void memset void dest int c sizet count 参数参数 dest 目的指针 c 设置的字符 count 字符个数 所需头文件所需头文件 或 功能功能 设置 dest 的前 count 个字节为字符 c 返回值返回值 返回 dest 的值 函数名函数名 swab 函数原型函数原型 void swab char src char dest int n 参数参数 src 需拷贝和交换的数据 dest 交换结果数据的存储位置 n 拷贝和交换的字节个数 所需头文件所需头文件 功能功能 从 src 拷贝 n 个字节 交换每对相邻的字节 并把结果存储在 dest 中 一般用于为转换到 使用不同字节次序的机器上而准备二进制数据 返回值返回值 无 B 2 字符分类函数字符分类函数 本类函数都只有一个 int 型参数 即要测试的整数 函数名函数名 isalnum 函数原型函数原型 int isalnum int c 所需头文件所需头文件 功能功能 测试 c 是否字母或数字 返回值返回值 如果 c 在 A Z a z 或 0 9 的范围内 则返回一个非 0 值 否则返回 0 函数名函数名 isalpha 函数原型函数原型 int isalpha int c 所需头文件所需头文件 功能功能 测试 c 是否字母 返回值返回值 如果 c 在 A Z 或 a z 的范围内 则返回一个非 0 值 否则返回 0 函数名函数名 isascll 函数原型函数原型 int isascll int c 所需头文件所需头文件 功能功能 测试 c 是否 ASCII 字符 返回值返回值 如果 c 为一个 0 x00 0 x7F 之间的 ASCII 字符 则返回一个非 0 值 否则返回 0 函数名函数名 iscntrl 函数原型函数原型 int iscntrl int c 所需头文件所需头文件 功能功能 测试 c 是否控制字符 返回值返回值 如果 c 是一个控制字符 0 x00 0 xlF 或 0 x7F 则返回一个非 0 值 否则返回 0 函数名函数名 iscsym 函数原型函数原型 int iscsym int c 所需头文件所需头文件 功能功能 测试 c 是否字母 下划线或数字 返回值返回值 如果 c 是一个字母 下划线或数字 则返回一个非 0 值 否则返回 0 函数名函数名 iscsymf 函数原型函数原型 int iscsymf int c 所需头文件所需头文件 功能功能 测试是否字母或下划线 返回值返回值 如果 c 是一个字母或下划线 则返回一个非 0 值 否则返回 0 函数名函数名 isdigit 函数原型函数原型 int isdigit int c 所需头文件所需头文件 功能功能 测试是否十进制数字 返回值返回值 如果 c 是一个十进制数字 0 9 则返回一个非 0 值 否则返回 0 函数名函数名 isgraph 函数原型函数原型 int isgraph int c 所需头文件所需头文件 功能功能 测试是否空格外的可打印字符 返回值返回值 如果 c 是一个非空格的其它可打印字符 则返回一个非 0 值 否则返回 0 函数名函数名 islower 函数原型函数原型 int islower int c 所需头文件所需头文件 功能功能 测试是否小写字母 返回值返回值 如果 c 是一个小写字母 a z 函数名函数名 isprint 函数原型函数原型 int isprint int c 所需头文件所需头文件 功能功能 测试是否可打印字符 返回值返回值 如果 c 是一个可打印字符包括空格字符 0 x20 0 x7E 则返回一个非 0 值 否则返回 0 函数名函数名 ispunct 函数原型函数原型 int ispunct int c 所需头文件所需头文件 功能功能 测试是否标点符号 返回值返回值 如果 c 是一个非空格字符并且是 isalnum 不为真的字符 则返回一个非 0 值 否则返回 0 函数名函数名 isspace 函数原型函数原型 int isspace int c 所需头文件所需头文件 功能功能 测试是否空白 返回值返回值 如果 c 是一个空白字符 0 x09 0 x0D 或 0 x20 则返回一个非 0 值 否则返回 0 函数名函数名 isupper 函数原型函数原型 int isupper int c 所需头文件所需头文件 功能功能 测试是否大写字母 返回值返回值 如果 c 是一个大写字母 则返回一个非 0 值 否则返回 0 函数名函数名 isxdigit 函数原型函数原型 int isxdigit int c 所需头文件所需头文件 功能功能 测试是否十六进制数字 返回值返回值 如果 c 是一个十六进制数字 A F a f 或 0 9 则返回一个非 0 值 否则返回 0 B 3 数据转换函数数据转换函数 函数名函数名 abs 函数原型函数原型 int abs int n 参数参数 n 整数值 所需头文件所需头文件 或 mat 功能功能 求绝对值 返回值返回值 返回 n 的绝对值 函数名函数名 atof atoi atol 函数原型函数原型 double atof const char string int atoi const char string long atol const char xstring 参数参数 string 要转换的字符串 所需头文件所需头文件 atof 需要和 其它需要 功能功能 将字符串转换成 double atof integer atoi 或 long ato1 型数据 返回值返回值 返回转换后的结果值 如果输入不能转换成对应类型的值 返回值为 0 0 atof 或 0 atoi atol 溢出情况下返回值不确定 函数名函数名 ecvt 函数原型函数原型 char ecvt double value int count int dec int sign 参数参数 value 被转换的数 count 存储的数字个数 dec 存储的小数点位置 sign 转换的数的符号 所需头文件所需头文件 功能功能 将 double 型浮点数转换成指定长度的字符串 返回值返回值 返回数字字符串的一个指针 没有错误返回 函数名函数名 fcvt 函数原型函数原型 char fcvt double value int count int dec int sign 参数参数 value 被转换的数值 lcount 小数点之后的位数 dec 存储的小数点位置的指针 sign 存储的 符号指示符的指针 所需头文件所需头文件 功能功能 将 double 型浮点数转换为以空字符结尾的字符串 返回值返回值 返回一个数字字符的指针 没有错误返回 函数名函数名 gcvt 函数原型函数原型 char gcvt double value int digits char buffer 参数参数 value 被转换的值 digits 存储的有效数字位数 buffer 结果的存储位置 所需头文件所需头文件 功能 功能 将 double 型浮点数转换成字符串 并将其存储在缓冲区中 返回值返回值 返回该数字字符串的指针 没有错误返回 函数名函数名 itoa ltoa 函数原型函数原型 char itoa int value char strmg int radix char ltoa 1ong value char string int radix 参数参数 value 要转换的数 string 结果字符串 radix value 的基数 必须在 2 36 的范围内 所需头文件所需头文件 功能功能 将 int itoa 或 long ltoa 型数据转换成一个以空字符结尾的字符串 并将结果存储在 string 中 至多 33 个字节 如果 radix 等于 10 且 value 为负数 结果字符串的第一个字符是负号 返回值返回值 返回参数 string 没有错误返回 函数名函数名 labs 函数原型函数原型 long labs 1ong n 参数参数 n 长整数值 所需头文件所需头文件 和 功能功能 求 long 整数的绝对值 返回值返回值 返回 n 的绝对值 没有错误返回 函数名函数名 strtod 函数原型函数原型 double strtod const char nptr char endptr 参数参数 nptr 要转换的以空字符结尾的字符串 endptr 停止扫描的字符的指针 所需头文件所需头文件 功能功能 将字符串 nptr 转换成 double 型数据 在遇到第一个不能作为数值识别的字符时停止 这可 能是结尾的空字符 返回值返回值 返回转换后的结果 如果发生上溢 函数返回十 一 HUGEVAL HUGEVAL 的符号与 需转换的值符号相同 如果不能进行转换或出现下溢出 则返回 0 函数名函数名 strtol 函数原型函数原型 long strtol const char nptr char endptr int base 参数参数 nptr 要转换的以空字符结尾的字符串 endptr 停止扫描的字符的指针 base 使用的基数 所需头文件所需头文件 功能功能 将字符串 nptr 转换成 long 型数据 在遇到第一个不能作为数值识别的字符时停止 这可能 是结尾的空字符 或者是第一个大于或等于 base 的数值字符 返回值返回值 返回转换后的结果 如果发生上溢 函数返回 LONGMAX 或 LONGMIN 如果不能执行 转换 则返回 0 函数名函数名 strtoul 函数原型函数原型 unsigned long strtoul const char nptr char endptr int base 参数参数 nptr 要转换的以空字符结尾的字符串 endptr 停止扫描的字符的指针 base 使用的基数 所需头文件所需头文件 功能功能 将字符串 nptr 转换成 unsignedlong 型数据 在读到字符串中第一个不能作为数值识别的字 符时停止 这可能是结尾的空字符或者是大于或等于 base 的第一个数值字符 返回值返回值 返回转换后的结果 如果发生上溢 函数返回 ULONGMAX 如果不能执行转换 则返 回 0 函数名函数名 toascii 函数原型函数原型 iht toascii int c 参数参数 c 要转换的字符 所需头文件所需头文件 功能功能 将字符转换成 ASCII 码 返回值返回值 返回转换结果 函数名函数名 tolower 函数原型函数原型 int tolower int c 参数参数 c 要转换的字符 所需头文件所需头文件 和 功能功能 将字符转换为小写字母 返回值返回值 返回转换结果 函数名函数名 toupper 函数原型函数原型 int toupper int c 参数参数 c 要转换的字符 所需头文件所需头文件 和 功能功能 将字符转换为大写字母 返回值返回值 返回转换结果 函数名函数名 ultoa 函数原型函数原型 char ultoa unsigned long value char string int radix 参数参数 value 要转换的数 string 字符串结果 Radix value 的基数 必须在 2 36 的范围内 所需头文件所需头文件 功能功能 将 value 转换成一个以空字符结尾的字符串 并存储在 string 中 至多 33 个字节 不执行上 溢出检查 返回值返回值 返回 string 的指针 没有错误返回 B 4 目录控制函数目录控制函数 函数名 函数名 chdir 函数原型 函数原型 int chdir const char dirname 参数 参数 dirname 新工作目录的路径 必须指向 个现存目录 所需头文件 所需头文件 功能 功能 将当前工作目录改变为 dirname 所指定的目录 如果在 dirname 中指定一个新驱动器字母 这个函数可以改变任何驱动器上的当前目录 缺省驱动器也可以改变 返回值 返回值 如果成功 返回 0 如所指定的路径未找到 则返回一 1 函数名函数名 chdrive 函数原型 函数原型 int chdrive int drive 参数 参数 drive 新工作驱动器号 使用一个整数指出新的工作驱动器 1 A 2 B 等等 所需头文件 所需头文件 功能 功能 将当前工作驱动器改变为 drive 指定的驱动器 返回值 返回值 如果工作驱动器成功改变 返回 0 值 否则返回 1 函数名 函数名 getcwd 函数原型 函数原型 char getcwd char buffer int maxlen 参数 参数 buffer 路径的存储位置 maxlen 路径的最大长度 以字符为单位 所需头文件 所需头文件 功能 功能 获取缺省驱动器上当前工作目录的完整路径 并存储在 buffer 中 包括结尾的空字符 超过 maxlen 会出现一个错误 返回值 返回值 返回 buffer 的指针 若出错 则返回 NULL 函数名 函数名 getdcwd 函数原型 函数原型 char getdcwd int drive char buffer int maxlen 参数 参数 drive 磁盘驱动器 buffer 路径的存储位置 maxlen 路径的最大长度 所需头文件 所需头文件 功能 功能 获取指定驱动器上当前工作目录的完整路径 并存储在 buffer 中 如果路径的长度 包括结 尾的空字符 超过 maxlen 会出现一个错误 返回值返回值 返回 buffer 的指针 若出错 则返回 NULL 函数名函数名 getdrive 函数原型 函数原型 int getdrive void 参数 参数 无 所需头文件所需头文件 功能 功能 获取当前 缺省 驱动器 返回值返回值 返回当前 缺省 驱动器 1 A 2 B 等等 没有错误返回 函数名 函数名 mkdir 函数原型 函数原型 int mkdir const char dirname 参数 参数 dirname 新目录的路径 所需头文件 所需头文件 功能 功能 用指定的 dirname 建立一个新目录 mkdir 每次调用仅建立一个新目录 返回值返回值 如果成功地建立了新目录 返回 0 出现错误时 返回 1 函数名 函数名 rmdir 函数原型函数原型 int rmdir const char dirname 参数参数 dirname 需删除的目录的路径 所需头文件 所需头文件 功能 功能 删除由 dirname 指定的目录 该目录必须为空必须不能是当前工作目录或根目录 返回值 返回值 如果该目录成功删除 返回 0 否则返回 1 函数名函数名 searchenv 函数原型 函数原型 void searchenv const char filename const cha varname char pathname 参数 参数 filename 要查找的文件的名称 va

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论