C语言-函数

合集下载

c语言字符串提取函数 -回复

c语言字符串提取函数 -回复

c语言字符串提取函数-回复C语言是一种广泛应用于嵌入式系统和系统编程的编程语言,字符串的处理是它非常重要的一部分。

在C语言中,字符串是由一系列字符组成的,可以用来表示文本和字符数据。

字符串提取是指从一个大字符串中提取出特定内容的操作。

在C语言中,我们可以借助一些字符串处理函数来实现字符串提取的功能。

本文将详细介绍C语言字符串提取函数的使用方法,以及一步一步回答相关问题。

一、C语言字符串提取函数的概述C语言提供了一些字符串处理函数,其中包括字符串提取函数。

这些函数可以用于从一个大字符串中提取出我们需要的内容。

常用的字符串提取函数有strstr、strchr、strrchr等。

接下来,我们将逐一介绍这些函数的使用方法。

二、字符串提取函数的使用方法1. strstr函数strstr函数用于在一个字符串中查找另一个字符串,并返回第一次出现的位置。

它的函数原型如下:cchar* strstr(const char* str1, const char* str2);其中,str1是要搜索的字符串,而str2是要查找的字符串。

该函数返回一个指向第一次出现str2的位置的指针,如果没有找到则返回NULL。

示例代码如下所示:c#include <stdio.h>#include <string.h>int main() {char str1[] = "Hello world!";char str2[] = "world";char* result = strstr(str1, str2);if (result == NULL) {printf("未找到匹配的字符串\n");} else {printf("找到匹配的字符串:s\n", result);}return 0;}在上述示例中,我们使用strstr函数从str1字符串中提取出str2字符串,并打印提取结果。

c语言中什么是函数

c语言中什么是函数

c语言中什么是函数函数(function)表示每个输入值对应唯一输出值的一种对应关系。

这种关系使一个集合里的每一个元素对应到另一个(可能相同的)集合里的唯一元素。

函数f中对应输入值的输出值x的标准符号为f(x)。

包含某个函数所有的输入值的集合被称作这个函数的定义域,包含所有的输出值的集合被称作值域。

若先定义映射的概念,可以简单定义函数为,定义在非空数集之间的映射称为函数。

函数(Function)是可以重复使用的一段代码。

参数函数的一个明显特征就是使用时带括号( ),必要的话,括号中还要包含数据或变量,称为参数(Parameter)。

参数是函数需要处理的数据,例如:strlen(str1)用来计算字符串的长度,str1就是参数。

puts("C语言中文网")用来输出字符串,"C语言中文网"就是参数。

返回值既然函数可以处理数据,那么就有必要将处理结果告诉我们,所以很多函数都有返回值。

所谓返回值,就是函数的执行结果。

例如:char str1[] = "C Language";int len = strlen(str1);strlen 的执行结果是字符串str1 的长度,是一个整数,我们通过len 变量来接收。

函数返回值有固定的数据类型(int、char、float等),用来接收返回值的变量类型要一致。

库函数C语言开发者已经为我们编写好了几百个常用的函数,并分门别类的放到了不同的头文件(实际上仅仅是在头文件中进行了声明),使用函数时,要引入对应的头文件。

这些在C语言发布时已经编写好的函数叫做库函数;我们也可以编写自己的函数,叫做自定义函数。

自定义函数和库函数没有本质的区别,表现形式和使用方法一样,只是作者不同而已。

C语言函数大全

C语言函数大全

C语言函数大全C语言作为一种广泛应用的计算机编程语言,其函数是程序设计中不可或缺的部分。

C语言函数大全涵盖了C语言中常用的各种函数,包括数学函数、字符串函数、输入输出函数等,本文将对这些函数进行详细介绍。

一、数学函数。

1. abs函数。

abs函数用于返回一个整数的绝对值,其原型为int abs(int x)。

2. pow函数。

pow函数用于计算一个数的幂,其原型为double pow(double x, double y)。

3. sqrt函数。

sqrt函数用于计算一个数的平方根,其原型为double sqrt(double x)。

4. sin函数。

sin函数用于计算一个角度的正弦值,其原型为double sin(double x)。

5. cos函数。

cos函数用于计算一个角度的余弦值,其原型为double cos(double x)。

6. tan函数。

tan函数用于计算一个角度的正切值,其原型为double tan(double x)。

二、字符串函数。

1. strlen函数。

strlen函数用于返回一个字符串的长度,其原型为size_t strlen(const char s)。

2. strcpy函数。

strcpy函数用于将一个字符串复制到另一个字符串中,其原型为charstrcpy(char dest, const char src)。

3. strcat函数。

strcat函数用于将一个字符串追加到另一个字符串的末尾,其原型为char strcat(char dest, const char src)。

4. strcmp函数。

strcmp函数用于比较两个字符串,其原型为int strcmp(const char s1, const char s2)。

5. strchr函数。

strchr函数用于在一个字符串中查找指定字符的位置,其原型为charstrchr(const char s, int c)。

C语言库函数大全

C语言库函数大全

C语言库函数大全absread()读磁盘绝对扇区函数原形:int absread(int drive,int num,int sectnum,void *buf)功能:从drive指定的驱动器磁盘上,sectnum指定的逻辑扇区号开始读取(通过DOS中断0x25读取)num个(最多64K个)扇区的内容,储存于buf所指的缓冲区中。

参数:drive=0对应A盘,drive=1对应B盘。

返回值:0:成功;-1:失败。

头文件:dos.habswrite()写磁盘绝对扇区函数原形:int abswrite(int drive,int nsects,int lsect,void *buffer)drive=0(A驱动器)、1(B驱动器)、nsects=要写的扇区数(最多64K个);lsect=起始逻辑扇区号;buffer=要写入数据的内存起始地址。

功能:将指定内容写入(调用DOS中断0x26)磁盘上的指定扇区,即使写入的地方是磁盘的逻辑结构、文件、FAT表和目录结构所在的扇区,也照常进行。

返回值:0:成功;-1:失败。

头文件:dos.hatof()将字符串转换成浮点数的函数原形:double atof(const char *s)功能:把s所指向的字符串转换成double类型。

s格式为:符号数字.数字 E符号数字返回值:字符串的转换值。

头文件:math.h、stdlib.hatoi()将字符串转换成整型数的函数原形:int atoi(const char *s)功能:把s所指向的字符串转换成int类型。

s格式为:符号数字返回值:字符串的转换值。

若出错则返回0。

头文件:stdlib.hatol()将字符串转换成长整型数的函数原形:long atol(const char *s)功能:把s所指向的字符串转换成long int类型。

s格式为:符号数字返回值:字符串的转换值。

若出错则返回0。

头文件:stdlib.hbcd()把一个数转换成对应的BCD码的函数原形:bcd bcd(int x)bcd bcd(double x)bcd bcd(double x,int decimals)注意:BCD码的精度可达17位。

c语言中函数的定义

c语言中函数的定义

C语言中函数的定义一、函数的概念和作用函数是C语言中最基本的代码组织单元之一,它可以将一段可重用的代码封装起来,并给它一个合适的名字。

通过函数的调用,可以在程序中多次复用这段代码,提高代码的可读性和可维护性。

函数在C语言中具有以下作用: 1. 实现代码的模块化:将程序分解为一个个的函数,每个函数负责完成一个特定的任务,使得程序结构清晰、易于理解和维护。

2. 提高代码的重用性:将一段经常使用的代码封装为函数,通过函数的调用可以在程序中多次复用,避免了重复编写相同的代码,减少了工作量。

3. 方便调试和错误追踪:若程序中出现错误,可以通过函数调用的栈帧信息追踪错误的发生位置,便于调试和修复bug。

二、函数的基本语法C语言中函数的定义包括函数声明和函数体两部分。

1. 函数声明函数声明用于告诉编译器函数的名称、返回类型和参数列表。

函数声明的语法如下:返回类型函数名(参数列表);其中,返回类型指明了函数执行完后的返回值类型,函数名是函数的唯一标识符,参数列表指明了函数的参数类型和参数名称。

2. 函数体函数体是函数的实际执行部分,由一组语句组成。

函数体的语法如下:返回类型函数名(参数列表){// 函数体语句return返回值;}函数体中的语句用来描述函数的执行逻辑,可以包括赋值语句、控制语句、循环语句等。

函数体最后一行的return语句用于将执行结果返回给函数调用者,可以省略,省略时函数的返回类型必须为void。

三、函数的定义和调用函数的定义是指实现函数功能的具体代码,它包括函数声明和函数体。

函数的调用是指在程序中使用函数完成特定任务的过程。

下面分别介绍函数的定义和函数的调用。

1. 函数的定义函数的定义一般放在C源文件的头部,用于告诉编译器这个函数的具体实现。

函数的定义包括函数头和函数体两部分,函数头通常与函数声明相同。

下面是函数的定义示例:// 函数声明int add(int a, int b);// 函数定义int add(int a, int b){return a + b;}2. 函数的调用函数的调用是指在程序中使用函数完成特定任务的过程。

C语言库函数使用大全

C语言库函数使用大全

C语言库函数使用大全C语言是一种面向过程的编程语言,它提供了大量的库函数来方便开发者进行各种操作。

在本篇文章中,我将介绍一些常用的C语言库函数,并说明它们的使用方法。

1.字符串处理函数:- strlen:用于计算字符串的长度。

- strcat:用于将两个字符串连接起来。

- strcpy:用于将一个字符串复制到另一个字符串中。

- strcmp:用于比较两个字符串是否相等。

2.数学函数:- abs:返回一个整数的绝对值。

- sqrt:返回一个数的平方根。

- pow:计算一个数的指定次幂。

- rand:生成一个随机数。

3.输入输出函数:- printf:用于打印输出。

- scanf:用于接受用户的输入。

- getchar:用于从输入流中读取一个字符。

- putchar:用于将一个字符输出到屏幕上。

4.内存管理函数:- malloc:用于在堆中分配指定大小的内存块。

- free:用于释放之前分配的内存。

- calloc:可以在堆中分配指定数量和大小的内存,并将每个字节初始化为0。

- realloc:用于调整之前分配的内存块的大小。

5.时间日期函数:6.文件操作函数:- fopen:用于打开一个文件。

- fclose:用于关闭一个文件。

- fgets:从文件中读取一行字符串。

- fputs:向文件中写入一行字符串。

7.数组处理函数:- memset:将一个数组的所有元素设置为指定的值。

- memcpy:将一个数组的内容复制到另一个数组中。

- memmove:将一个数组的内容移动到另一个数组中,处理重叠情况。

- qsort:用于对数组进行快速排序。

这只是C语言库函数的一小部分,还有很多其他函数可供使用。

在实际开发中,根据需求选择适合的函数,可以提高代码的效率和可读性。

总结:C语言库函数提供了丰富的功能,可以帮助开发者简化编程过程。

在使用库函数时,需要仔细阅读函数的说明文档,并根据需求选择适合的函数和参数。

通过充分利用库函数,可以提高代码的开发效率和质量。

C语言中常见功能函数

C语言中常见功能函数

C语言中常见功能函数在C语言中,有很多常见的功能函数,它们是为了方便程序员在开发过程中进行一些常见操作而设计的。

下面是其中一些常见的功能函数:1.字符串操作函数:- strlen:用于获取字符串的长度。

- strcpy:用于复制字符串。

- strcat:用于拼接两个字符串。

- strcmp:用于比较两个字符串。

- strchr:用于在字符串中查找指定字符。

- strstr:用于在字符串中查找指定子字符串。

2.内存操作函数:- malloc:用于动态分配内存。

- free:用于释放动态分配的内存。

- memcpy:用于内存拷贝。

- memset:用于内存初始化。

3.文件操作函数:- fopen:用于打开文件。

- fclose:用于关闭文件。

- fgets:用于从文件中读取一行数据。

- fputs:用于向文件中写入一行数据。

- feof:用于判断是否到达文件末尾。

4.数学函数:- abs:用于计算绝对值。

- sin、cos、tan:用于计算三角函数值。

- sqrt:用于计算平方根。

- pow:用于计算幂运算。

5.随机数函数:- srand:用于设置随机数种子。

- rand:用于生成随机数。

6.时间函数:7.输入输出函数:- printf:用于向标准输出设备打印输出。

- scanf:用于从标准输入设备读取输入。

8.排序和查找函数:- qsort:用于对数组进行快速排序。

- bsearch:用于在有序数组中进行二分查找。

9.环境变量函数:- getenv:用于获取环境变量的值。

- setenv:用于设置环境变量的值。

10.字符处理函数:- isdigit:用于判断字符是否是数字。

- isalpha:用于判断字符是否是字母。

- isspace:用于判断字符是否是空白字符。

以上只是C语言中常见的一些功能函数,实际上C语言库中还有很多其他功能函数,可以根据需求选择合适的函数来完成相应的操作。

无论是字符串操作、内存操作、文件操作、数学运算,还是随机数生成、时间处理、输入输出以及排序和查找等,C语言提供了丰富的函数库来支持这些常见的功能需求。

C语言--函数

C语言--函数
7
函数返回值示例
内存 #include <stdio.h> age1 age2 age3 int get_age(); void main() 78 54 65 { int age1, age2, age3; int get_age() age1 = get_age(); { age2 = get_age(); int age; age3 = get_age(); printf("\n请输入年龄: "); if ( (age1 > age2) && (age1 > age3)) scanf("%d",&age); printf("\n年龄为 %d 的人最大\n", age1); return age; else if( (age2 > age1) && (age2 > age3)) } printf("\n年龄为 %d 的人最大\n", age2); else if( (age3 > age1) && (age3 > age2)) 请输入年龄:65 printf("\n年龄为 %d 的人最大\n", age2);请输入年龄:78 请输入年龄:54 } 年龄为 78 岁的人最大
14
函数参数和函数的值
形参与实参
形式参数:定义函数时函数名后面括号中的变量名 实际参数:调用函数时函数名后面括号中的表达式
例 比较两个数并输出大者
main() { int a,b,c; scanf("%d,%d",&a,&b); c=max(a,b); (main 函数) c=max(a,b); printf("Max is %d",c); max(int x, int y) (max 函数) { int z; } z=x>y?x:y; max(int x, int y) return(z); { int z; } z=x>y?x:y; return(z); }

c语言数学函数大全及详解

c语言数学函数大全及详解

c语言数学函数大全及详解C语言提供了一系列的数学函数,这些函数包含在`math.h` 头文件中。

以下是一些常见的C 语言数学函数及其简要说明:1. fabs:-函数原型:`double fabs(double x);`-描述:返回`x` 的绝对值。

2. sqrt:-函数原型:`double sqrt(double x);`-描述:返回`x` 的平方根。

3. pow:-函数原型:`double pow(double x, double y);`-描述:返回`x` 的`y` 次方。

4. exp:-函数原型:`double exp(double x);`-描述:返回自然对数的底`e` 的`x` 次方。

5. log:-函数原型:`double log(double x);`-描述:返回`x` 的自然对数。

6. sin, cos, tan:-函数原型:- `double sin(double x);`- `double cos(double x);`- `double tan(double x);`-描述:分别返回`x` 的正弦、余弦和正切值。

这些函数中`x` 的单位是弧度。

7. asin, acos, atan:-函数原型:- `double asin(double x);`- `double acos(double x);`- `double atan(double x);`-描述:分别返回`x` 的反正弦、反余弦和反正切值。

返回的值是弧度。

8. sinh, cosh, tanh:-函数原型:- `double sinh(double x);`- `double cosh(double x);`- `double tanh(double x);`-描述:分别返回`x` 的双曲正弦、双曲余弦和双曲正切值。

9. ceil:-函数原型:`double ceil(double x);`-描述:返回不小于`x` 的最小整数值。

C语言中常用函数大全

C语言中常用函数大全
注意: 这里原始内‎存中 的数据‎还是保 持不‎变的。当 内存不再‎使用时 ,应使用 fr ‎ee()函数将内存‎块释放。
(三)文件函数
mode: r:打开已存在‎文件,准备从文件‎中读取数据‎ ,不能写入 r+ :可读可写
w:创建一个新‎文件,准备写入;如文件已存‎在,此文件将被 ‎空文件覆盖‎ w+:增加“读取”操作
2;字符ar(int c) 正常返回字‎ 符代码值,出错返回 E‎ OF (2)int putc(int c,FILE*strea‎ m) 正常返回字‎ 符代码值,出错返回 E‎ OF strea‎ m==stdou‎ t(1)=(2) (3)int puts(char*strea‎ m) 自动回车换‎ 行
a:打开已存在‎文件,准备在文件‎尾部追加数‎ 据,不能读取。 如文件不存‎在,侧创建此文 ‎ 件,准备写入。
a+:增加“读取”
t:打开一个文‎ 本文件(缺省值) b:打开一个二‎ 进制文件
一:文件的打开‎ 与关闭 1:打开文件 FILE * fopen‎ (char*filen‎ ame, char*mode) Filen‎ame:是字符串,表示打开的‎文件名,文件名前可 ‎ 以带路径。 Mode:也是字符串‎,表示打开文‎ 件的方式。 功能----按指定方式‎ 打开文件。 返回值----如果文件打‎开成功,返回“文件结构体 ‎ 指针”,否者返回 N‎ ULL(如:文件不存在 ‎ 或则 写文件‎时不能创建‎ )。 Fopen‎(“A:\\user\\asd.txt”,”r+”); 2:关闭文件 Int*fclos‎ e(FILE*filen‎ ame) 正常关闭返‎ 回0;否者返回 非 0。
With:指定输入数‎ 据的宽度,遇空格、Tab、\n 结束

C语言课件第07章-自定义函数

C语言课件第07章-自定义函数

在主函数或其他函数中,我们可以使用y=sum();语句执行函数sum,并把 函数的值送给y,或者用printf("%d",sum());直接输出函数sum的值。
第7章 自定义函数
2. 有参函数的定义形式 如果一个函数,需要调用者提供原始数据才能执 行(如sqrt函数),则这种函数可以被定义成有 参函数。其定义形式如下:
第7章 自定义函数
下面我们定义一个函数,名叫 printStar,其功能就是专门输出 则,主函数代码可以简化为:
经过函数调用,程序的代码行大大缩水,且main 函数更清晰且可读性更好。
第7章 自定义函数
如果我们把printStar函数的代码放到d盘根目录 下的一个文本文件中,比如放到function.txt文 本文件中,其他的程序如果有需要,也完全可以 用#include <d:\function.txt>把有关内容包含 到对应程序文件中,在需要的时候调用printStar 函数即可 。 函数:函数就是一个用名字命名的独立的程序块( 子程序),能实现某些功能,可供本程序其他函数 ,或者另外一些程序的函数调用。
第7章 自定义函数
factorial 函数专门求n的阶乘
第7章 自定义函数
形式参数(形参):函数在声明(定义) 的时候,同时对函数所需要的参数的数量、类型做出 说明。这些参数的名字只是一种形式,只有在函数被 调用时,这些参数才能得到具体值,所以这些参数为 形式参数。比如,函数求阶乘函数中的n就是形式参 数。 实际参数(实参):一个有参函数在被调用的时候, 主调函数必须根据被调用函数形参(形式参数)的要 求,传递具体数据给被调用函数的形参,这些实际的 数据就叫做实际参数,也就是我们所说的实参。 实参是有具体值的,实参可以是常数,也可以是变量 。但在使用时必须有具体值。

C语言题库-函数

C语言题库-函数

C语言函数练习题一、选择题1. 在函数的说明和定义时若没有指出函数的类型,则(A)A: 系统自动地认为函数的类型为整型。

B: 系统自动地认为函数的类型为字符型。

C: 系统自动地认为函数的类型为实型。

D: 编译时会出错。

2.下面正确的函数定义形式是( A )A:double fun(int x,int y) { }B:double fun(int x;int y) { }C:double fun(int x,int y);D:double fun(int x,y);3.若调用一个函数,且此函数中没有 return 语句,则正确的说法是:该函数( D )A:没有返回值;B:返回若干个系统默认值;C:能返回一个用户所希望的函数值;D:返回一个不确定的值4.C 语言允许函数返回值类型缺省定义,此时该函数隐含的返回值类型是( B)A: float型B: int型C:long 型D:double 型5.C 语言规定,函数返回值的类型是由( D )(二级题)A: return语句中的表达式类型所决定;B:调用该函数时的主调函数类型所决定;C:调用该函数时系统临时决定;D:在定义该函数时所指定的函数类型所决定6. 下面函数调用语句含有实参的个数为(B)func((exp1,exp2),(exp3,exp4,exp5));A: 1B: 2C: 5D: 47.以下错误的描述是( D )函数的调用可以A:出现在执行语句中;B:出现在一个表达式中;C:为一个函数的实参;D:作为一个函数的形参;8. 若函数的形参为一维数组,则下列说法中正确的是(B)A:调用函数时的对应实参必为数组名。

B:形参数组可以不指定大小。

C:形参数组的元素个数必须等于实参数组的元素个数。

D:形参数组的元素个数必须多于实参数组的元素个数。

9.下面叙述中正确的是( C )A:对于用户自己定义的函数,在使用前必须加以说明。

B:说明函数时必须明确其参数类型和返回类型。

C语言函数的定义

C语言函数的定义

C语言函数的定义C语言函数的定义引导语:函数表示每个输入值对应唯一输出值的一种对应关系。

这种关系使一个集合里的每一个元素对应到另一个(可能相同的)集合里的唯一元素。

以下是店铺分享给大家的C语言函数的定义,欢迎参考学习!一、函数的定义一个函数包括函数头和语句体两部分。

函数头由下列三不分组成:函数返回值类型函数名参数表一个完整的函数应该是这样的:函数返回值类型函数名(参数表){语句体;}函数返回值类型可以是前面说到的某个数据类型、或者是某个数据类型的指针、指向结构的指针、指向数组的指针。

指针概念到以后再介绍。

函数名在程序中必须是唯一的,它也遵循标识符命名规则。

参数表可以没有也可以有多个,在函数调用的时候,实际参数将被拷贝到这些变量中。

语句体包括局部变量的声明和可执行代码。

我们在前面其实已经接触过函数了,如abs(),sqrt(),我们并不知道它的内部是什么,我们只要会使用它即可。

这一节主要讲解无参数无返回值的函数调用。

二、函数的声明和调用为了调用一个函数,必须事先声明该函数的返回值类型和参数类型,这和使用变量的道理是一样的(有一种可以例外,就是函数的定义在调用之前,下面再讲述)。

看一个简单的例子:void a(); /*函数声明*/main(){a(); /*函数调用*/}void a() /*函数定义*/{int num;scanf(%d,&num);printf(%d ,num);}在main()的前面声明了一个函数,函数类型是void型,函数名为a,无参数。

然后在main()函数里面调用这个函数,该函数的作用很简单,就是输入一个整数然后再显示它。

在调用函数之前声明了该函数其实它和下面这个程序的功能是一样的:main(){int num;scanf(%d,&num);printf(%d ,num);}可以看出,实际上就是把a()函数里面的所有内容直接搬到main()函数里面(注意,这句话不是绝对的。

四川大学《c语言程序设计》课件-第5章 函数

四川大学《c语言程序设计》课件-第5章 函数

用void定义参数 ,表示没有参数
void 函数名(void)
{ 声明语句序列 可执行语句序列 return ;
}
return语句后无需 任何表达式
【例】 计算整数n的阶乘n!
/* 函数功能: 用迭代法计算n!
返回值函数类入型口参数:函整数型名变量说n明表示阶乘的形阶参数表,函
函数返回值: 函返数回的n!功的能值
函数定义(Function definition)
返回值 类型
函数名标识符, 说明运算规则
参数表相当于 运算的操作数
类型 函数名(类型 参数1, 类型 参数2, ……)
{ 声明语句序列
可执行语句序列 return 表达式;
}
函数出口
返回运算的结果
函数定义(Function definition)
因变量
函数名
自变量
程序设计中的函数
程序设计中的函数不局限于计算 –计算类,如打印阶乘表的程序…… –判断推理类,如排序、查找……
问题的提出
读多少行的程序能让你不头疼? 假如系统提供的函数printf()由10行代码替换,那么你编过的程 序会成什么样子?
–实际上一个printf()有上千行代码 main()中能放多少行代码? 如果所有代码都在main()中,怎么团队合作? 如果代码都在一个文件中,怎么团队合作?
C程序的存储类别 – auto型(自动变量) – static型(静态变量) – extern型(外部变量) – register型(寄存器变量)
变量的存储类型( Storage Class)
变量的生存期(Lifetime )
The lifetime of a variable is the period of time during which memory is allocated to the variable

C语言函数大全-G篇

C语言函数大全-G篇

G:函数名: gcvt功能: 把浮点数转换成字符串用法: char *gcvt(double value, int ndigit, char *buf); 程序例:#include <stdlib.h>#include <stdio.h>int main(void){char str[25];double num;int sig = 5; /* significant digits *//* a regular number */num = 9.876;gcvt(num, sig, str);printf("string = %s\n", str);/* a negative number */num = -123.4567;gcvt(num, sig, str);printf("string = %s\n", str);/* scientific notation */num = 0.678e5;gcvt(num, sig, str);printf("string = %s\n", str);return(0);}函数名: geninterrupt功能: 产生一个软中断用法: void geninterrupt(int intr_num);程序例:#include <conio.h>#include <dos.h>/* function prototype */void writechar(char ch);int main(void){clrscr();gotoxy(80,25);writechar('*');getch();return 0;}/*outputs a character at the current cursorposition using the video BIOS to avoid thescrolling of the screen when writing tolocation (80,25).*/void writechar(char ch){struct text_info ti;/* grab current text settings */gettextinfo(&ti);/* interrupt 0x10 sub-function 9 */_AH = 9;/* character to be output */_AL = ch;_BH = 0; /* video page */_BL = ti.attribute; /* video attribute */_CX = 1; /* repetition factor */geninterrupt(0x10); /* output the char */}函数名: getarccoords功能: 取得最后一次调用arc的坐标用法: void far getarccoords(struct arccoordstype far *arccoords); 程序例:#include <graphics.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>int main(void){/* request auto detection */int gdriver = DETECT, gmode, errorcode;struct arccoordstype arcinfo;int midx, midy;int stangle = 45, endangle = 270;char sstr[80], estr[80];/* initialize graphics and local variables */ initgraph(&gdriver, &gmode, "");/* read result of initialization */ errorcode = graphresult();/* an error occurred */if (errorcode != grOk){printf("Graphics error: %s\n",grapherrormsg(errorcode));printf("Press any key to halt:");getch();/* terminate with an error code */exit(1);}midx = getmaxx() / 2;midy = getmaxy() / 2;/* draw arc and get coordinates */ setcolor(getmaxcolor());arc(midx, midy, stangle, endangle, 100); getarccoords(&arcinfo);/* convert arc information into strings */ sprintf(sstr, "*- (%d, %d)",arcinfo.xstart, arcinfo.ystart);sprintf(estr, "*- (%d, %d)",arcinfo.xend, arcinfo.yend);/* output the arc information */ outtextxy(arcinfo.xstart,arcinfo.ystart, sstr);outtextxy(arcinfo.xend,arcinfo.yend, estr);/* clean up */getch();closegraph();return 0;}函数名: getaspectratio功能: 返回当前图形模式的纵横比用法: void far getaspectratio(int far *xasp, int far *yasp); 程序例:#include <graphics.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>int main(void){/* request auto detection */int gdriver = DETECT, gmode, errorcode;int xasp, yasp, midx, midy;/* initialize graphics and local variables */initgraph(&gdriver, &gmode, "");/* read result of initialization */errorcode = graphresult();/* an error occurred */if (errorcode != grOk){printf("Graphics error: %s\n",grapherrormsg(errorcode));printf("Press any key to halt:");getch();/* terminate with an error code */exit(1);}midx = getmaxx() / 2;midy = getmaxy() / 2;setcolor(getmaxcolor());/* get current aspect ratio settings */getaspectratio(&xasp, &yasp);/* draw normal circle */circle(midx, midy, 100);getch();/* draw wide circle */cleardevice();setaspectratio(xasp/2, yasp);circle(midx, midy, 100);getch();/* draw narrow circle */cleardevice();setaspectratio(xasp, yasp/2);circle(midx, midy, 100);/* clean up */getch();closegraph();return 0;}函数名: getbkcolor功能: 返回当前背景颜色用法: int far getbkcolor(void);程序例:#include <graphics.h>#include <stdlib.h>#include <string.h>#include <stdio.h>#include <conio.h>int main(void){/* request auto detection */int gdriver = DETECT, gmode, errorcode; int bkcolor, midx, midy;char bkname[35];/* initialize graphics and local variables */ initgraph(&gdriver, &gmode, "");/* read result of initialization */errorcode = graphresult();/* an error occurred */if (errorcode != grOk){printf("Graphics error: %s\n",grapherrormsg(errorcode));printf("Press any key to halt:");getch();/* terminate with an error code */exit(1);}midx = getmaxx() / 2;midy = getmaxy() / 2;setcolor(getmaxcolor());/* for centering text on the display */ settextjustify(CENTER_TEXT, CENTER_TEXT); /* get the current background color */bkcolor = getbkcolor();/* convert color value into a string */itoa(bkcolor, bkname, 10);strcat(bkname," is the current background color.");/* display a message */outtextxy(midx, midy, bkname);/* clean up */getch();closegraph();return 0;}函数名: getc功能: 从流中取字符用法: int getc(FILE *stream);程序例:#include <stdio.h>int main(void){char ch;printf("Input a character:");/* read a character from thestandard input stream */ch = getc(stdin);printf("The character input was: '%c'\n", ch);return 0;}函数名: getcbrk功能: 获取Control_break设置用法: int getcbrk(void);程序例:#include <stdio.h>#include <dos.h>int main(void){if (getcbrk())printf("Cntrl-brk flag is on\n");elseprintf("Cntrl-brk flag is off\n"); return 0;}函数名: getch功能: 从控制台无回显地取一个字符用法: int getch(void);程序例:#include <stdio.h>#include <conio.h>int main(void){char ch;printf("Input a character:");ch = getche();printf("\nYou input a '%c'\n", ch); return 0;}函数名: getchar功能: 从stdin流中读字符用法: int getchar(void);程序例:#include <stdio.h>int main(void){int c;/* Note that getchar reads from stdin and is line buffered; this means it willnot return until you press ENTER. */ while ((c = getchar()) != '\n')printf("%c", c);return 0;}函数名: getche功能: 从控制台取字符(带回显)用法: int getche(void);程序例:#include <stdio.h>#include <conio.h>int main(void){char ch;printf("Input a character:");ch = getche();printf("\nYou input a '%c'\n", ch);return 0;}函数名: getcolor功能: 返回当前画线颜色用法: int far getcolor(void);程序例:#include <graphics.h>#include <stdlib.h>#include <string.h>#include <stdio.h>#include <conio.h>int main(void){/* request auto detection */int gdriver = DETECT, gmode, errorcode;int color, midx, midy;char colname[35];/* initialize graphics and local variables */ initgraph(&gdriver, &gmode, "");/* read result of initialization */errorcode = graphresult();/* an error occurred */if (errorcode != grOk){printf("Graphics error: %s\n",grapherrormsg(errorcode));printf("Press any key to halt:");getch();/* terminate with an error code */exit(1);}midx = getmaxx() / 2;midy = getmaxy() / 2;setcolor(getmaxcolor());/* for centering text on the display */ settextjustify(CENTER_TEXT, CENTER_TEXT); /* get the current drawing color */color = getcolor();/* convert color value into a string */itoa(color, colname, 10);strcat(colname," is the current drawing color.");/* display a message */outtextxy(midx, midy, colname);/* clean up */getch();closegraph();return 0;}函数名: getcurdir功能: 取指定驱动器的当前目录用法: int getcurdir(int drive, char *direc);程序例:#include <dir.h>#include <stdio.h>#include <string.h>char *current_directory(char *path){strcpy(path, "X:\\"); /* fill string with form of response: X:\ */ path[0] = 'A' + getdisk(); /* replace X with current drive letter */ getcurdir(0, path+3); /* fill rest of string with current directory */ return(path);}int main(void){char curdir[MAXPATH];current_directory(curdir);printf("The current directory is %s\n", curdir);return 0;}函数名: getcwd功能: 取当前工作目录用法: char *getcwd(char *buf, int n);程序例:#include <stdio.h>#include <dir.h>int main(void){char buffer[MAXPATH];getcwd(buffer, MAXPATH);printf("The current directory is: %s\n", buffer);return 0;}函数名: getdate功能: 取DOS日期用法: void getdate(struct *dateblk);程序例:#include <dos.h>#include <stdio.h>int main(void){struct date d;getdate(&d);printf("The current year is: %d\n",d.da_year);printf("The current day is: %d\n",d.da_day);printf("The current month is: %d\n",d.da_mon);return 0;}函数名: getdefaultpalette功能: 返回调色板定义结构用法: struct palettetype *far getdefaultpalette(void); 程序例:#include <graphics.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>int main(void){/* request auto detection */int gdriver = DETECT, gmode, errorcode;int i;/* structure for returning palette copy */struct palettetype far *pal=(void *) 0;/* initialize graphics and local variables */ initgraph(&gdriver, &gmode, "");/* read result of initialization */errorcode = graphresult();/* an error occurred */if (errorcode != grOk){printf("Graphics error: %s\n",grapherrormsg(errorcode));printf("Press any key to halt:");getch();/* terminate with an error code */exit(1);}setcolor(getmaxcolor());/* return a pointer to the default palette */ pal = getdefaultpalette();for (i=0; i<16; i++){printf("colors[%d] = %d\n", i,pal->colors[i]);getch();}/* clean up */getch();closegraph();return 0;}函数名: getdisk功能: 取当前磁盘驱动器号用法: int getdisk(void);程序例:#include <stdio.h>#include <dir.h>int main(void){int disk;disk = getdisk() + 'A';printf("The current drive is: %c\n",disk);return 0;}函数名: getdrivername功能: 返回指向包含当前图形驱动程序名字的字符串指针用法: char *getdrivename(void);程序例:#include <graphics.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>int main(void){/* request auto detection */int gdriver = DETECT, gmode, errorcode;/* stores the device driver name */char *drivername;/* initialize graphics and local variables */initgraph(&gdriver, &gmode, "");/* read result of initialization */errorcode = graphresult();/* an error occurred */if (errorcode != grOk){printf("Graphics error: %s\n",grapherrormsg(errorcode));printf("Press any key to halt:");getch();/* terminate with an error code */exit(1);}setcolor(getmaxcolor());/* get name of the device driver in use */drivername = getdrivername();/* for centering text on the screen */settextjustify(CENTER_TEXT, CENTER_TEXT);/* output the name of the driver */outtextxy(getmaxx() / 2, getmaxy() / 2,drivername);/* clean up */getch();closegraph();return 0;}函数名: getdta功能: 取磁盘传输地址用法: char far *getdta(void);程序例:#include <dos.h>#include <stdio.h>int main(void){char far *dta;dta = getdta();printf("The current disk transfer \address is: %Fp\n", dta);return 0;}函数名: getenv功能: 从环境中取字符串用法: char *getenv(char *envvar);程序例:#include <stdlib.h>#include <stdio.h>int main(void){char *s;s=getenv("COMSPEC"); /* get the comspec environment parameter */ printf("Command processor: %s\n",s); /* display comspec parameter */ return 0;}函数名: getfat, getfatd功能: 取文件分配表信息用法: void getfat(int drive, struct fatinfo *fatblkp); 程序例:#include <stdio.h>#include <dos.h>int main(void){struct fatinfo diskinfo;int flag = 0;printf("Please insert disk in drive A\n");getchar();getfat(1, &diskinfo);/* get drive information */printf("\nDrive A: is ");switch((unsigned char) diskinfo.fi_fatid){case 0xFD:printf("360K low density\n");break;case 0xF9:printf("1.2 Meg high density\n");break;default:printf("unformatted\n");flag = 1;}if (!flag){printf(" sectors per cluster %5d\n",diskinfo.fi_sclus);printf(" number of clusters %5d\n",diskinfo.fi_nclus);printf(" bytes per sector %5d\n",diskinfo.fi_bysec);}return 0;}函数名: getfillpattern功能: 将用户定义的填充模式拷贝到内存中用法: void far getfillpattern(char far *upattern);程序例:#include <graphics.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>int main(void){/* request auto detection */int gdriver = DETECT, gmode, errorcode;int maxx, maxy;char pattern[8] = {0x00, 0x70, 0x20, 0x27, 0x25, 0x27, 0x04, 0x04}; /* initialize graphics and local variables */initgraph(&gdriver, &gmode, "");/* read result of initialization */errorcode = graphresult();if (errorcode != grOk) /* an error occurred */{printf("Graphics error: %s\n", grapherrormsg(errorcode));printf("Press any key to halt:");getch();exit(1); /* terminate with an error code */}maxx = getmaxx();maxy = getmaxy();setcolor(getmaxcolor());/* select a user defined fill pattern */setfillpattern(pattern, getmaxcolor());/* fill the screen with the pattern */bar(0, 0, maxx, maxy);getch();/* get the current user defined fill pattern */getfillpattern(pattern);/* alter the pattern we grabbed */pattern[4] -= 1;pattern[5] -= 3;pattern[6] += 3;pattern[7] -= 4;/* select our new pattern */setfillpattern(pattern, getmaxcolor());/* fill the screen with the new pattern */bar(0, 0, maxx, maxy);/* clean up */getch();closegraph();return 0;}函数名: getfillsettings功能: 取得有关当前填充模式和填充颜色的信息用法: void far getfillsettings(struct fillsettingstype far *fillinfo); 程序例:#include <graphics.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>/ the names of the fill styles supported */char *fname[] = { "EMPTY_FILL","SOLID_FILL","LINE_FILL","LTSLASH_FILL","SLASH_FILL","BKSLASH_FILL","LTBKSLASH_FILL","HATCH_FILL","XHATCH_FILL","INTERLEAVE_FILL","WIDE_DOT_FILL","CLOSE_DOT_FILL","USER_FILL"};int main(void){/* request auto detection */int gdriver = DETECT, gmode, errorcode;struct fillsettingstype fillinfo;int midx, midy;char patstr[40], colstr[40];/* initialize graphics and local variables */initgraph(&gdriver, &gmode, "");/* read result of initialization */errorcode = graphresult();if (errorcode != grOk) /* an error occurred */{printf("Graphics error: %s\n", grapherrormsg(errorcode));printf("Press any key to halt:");getch();exit(1); /* terminate with an error code */}midx = getmaxx() / 2;midy = getmaxy() / 2;/* get information about current fill pattern and color */ getfillsettings(&fillinfo);/* convert fill information into strings */sprintf(patstr, "%s is the fill style.", fname[fillinfo.pattern]); sprintf(colstr, "%d is the fill color.", fillinfo.color);/* display the information */settextjustify(CENTER_TEXT, CENTER_TEXT); outtextxy(midx, midy, patstr);outtextxy(midx, midy+2*textheight("W"), colstr);/* clean up */getch();closegraph();return 0;}函数名: getftime功能: 取文件日期和时间用法: int getftime(int handle, struct ftime *ftimep);程序例:#include <stdio.h>#include <io.h>int main(void){FILE *stream;struct ftime ft;if ((stream = fopen("TEST.$$$","wt")) == NULL){fprintf(stderr,"Cannot open output file.\n");return 1;}getftime(fileno(stream), &ft);printf("File time: %u:%u:%u\n",ft.ft_hour, ft.ft_min,ft.ft_tsec * 2);printf("File date: %u/%u/%u\n",ft.ft_month, ft.ft_day,ft.ft_year+1980);fclose(stream);return 0;}函数名: getgraphmode功能: 返回当前图形模式用法: int far getgraphmode(void);程序例:#include <graphics.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>int main(void){/* request auto detection */int gdriver = DETECT, gmode, errorcode; int midx, midy, mode;char numname[80], modename[80];/* initialize graphics and local variables */ initgraph(&gdriver, &gmode, "");/* read result of initialization */errorcode = graphresult();/* an error occurred */if (errorcode != grOk){printf("Graphics error: %s\n",grapherrormsg(errorcode));printf("Press any key to halt:");getch();/* terminate with an error code */exit(1);}midx = getmaxx() / 2;midy = getmaxy() / 2;/* get mode number and name strings */mode = getgraphmode();sprintf(numname,"%d is the current mode number.",mode);sprintf(modename,"%s is the current graphics mode",getmodename(mode));/* display the information */settextjustify(CENTER_TEXT, CENTER_TEXT); outtextxy(midx, midy, numname);outtextxy(midx, midy+2*textheight("W"),modename);/* clean up */getch();closegraph();return 0;}函数名: getftime功能: 取文件日期和时间用法: int getftime(int handle, struct ftime *ftimep); 程序例:#include <stdio.h>#include <io.h>int main(void){FILE *stream;struct ftime ft;if ((stream = fopen("TEST.$$$","wt")) == NULL){fprintf(stderr,"Cannot open output file.\n");return 1;}getftime(fileno(stream), &ft);printf("File time: %u:%u:%u\n",ft.ft_hour, ft.ft_min,ft.ft_tsec * 2);printf("File date: %u/%u/%u\n",ft.ft_month, ft.ft_day,ft.ft_year+1980);fclose(stream);return 0;}函数名: getgraphmode功能: 返回当前图形模式用法: int far getgraphmode(void);程序例:#include <graphics.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>int main(void){/* request auto detection */int gdriver = DETECT, gmode, errorcode; int midx, midy, mode;char numname[80], modename[80];/* initialize graphics and local variables */ initgraph(&gdriver, &gmode, "");/* read result of initialization */errorcode = graphresult();/* an error occurred */if (errorcode != grOk){printf("Graphics error: %s\n",grapherrormsg(errorcode));printf("Press any key to halt:");getch();/* terminate with an error code */exit(1);}midx = getmaxx() / 2;midy = getmaxy() / 2;/* get mode number and name strings */mode = getgraphmode();sprintf(numname,"%d is the current mode number.",mode);sprintf(modename,"%s is the current graphics mode",getmodename(mode));/* display the information */settextjustify(CENTER_TEXT, CENTER_TEXT);outtextxy(midx, midy, numname);outtextxy(midx, midy+2*textheight("W"),modename);/* clean up */getch();closegraph();return 0;}函数名: getimage功能: 将指定区域的一个位图存到主存中用法: void far getimage(int left, int top, int right, int bottom, void far *bitmap);程序例:#include <graphics.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>#include <alloc.h>void save_screen(void far *buf[4]);void restore_screen(void far *buf[4]);int maxx, maxy;int main(void){int gdriver=DETECT, gmode, errorcode;void far *ptr[4];/* auto-detect the graphics driver and mode */ initgraph(&gdriver, &gmode, "");errorcode = graphresult(); /* check for any errors */if (errorcode != grOk){printf("Graphics error: %s\n", grapherrormsg(errorcode));printf("Press any key to halt:");getch();exit(1);}maxx = getmaxx();maxy = getmaxy();/* draw an image on the screen */rectangle(0, 0, maxx, maxy);line(0, 0, maxx, maxy);line(0, maxy, maxx, 0);save_screen(ptr); /* save the current screen */getch(); /* pause screen */cleardevice(); /* clear screen */restore_screen(ptr); /* restore the screen */getch(); /* pause screen */closegraph();return 0;}void save_screen(void far *buf[4]){unsigned size;int ystart=0, yend, yincr, block;yincr = (maxy+1) / 4;yend = yincr;size = imagesize(0, ystart, maxx, yend); /* get byte size of image */ for (block=0; block<=3; block++){if ((buf[block] = farmalloc(size)) == NULL){closegraph();printf("Error: not enough heap space in save_screen().\n");exit(1);}getimage(0, ystart, maxx, yend, buf[block]);ystart = yend + 1;yend += yincr + 1;}}void save_screen(void far *buf[4]){unsigned size;int ystart=0, yend, yincr, block;yincr = (maxy+1) / 4;yend = yincr;size = imagesize(0, ystart, maxx, yend); /* get byte size of image */ for (block=0; block<=3; block++){if ((buf[block] = farmalloc(size)) == NULL){closegraph();printf("Error: not enough heap space in save_screen().\n");exit(1);}getimage(0, ystart, maxx, yend, buf[block]);ystart = yend + 1;yend += yincr + 1;}}void restore_screen(void far *buf[4]){int ystart=0, yend, yincr, block;yincr = (maxy+1) / 4;yend = yincr;for (block=0; block<=3; block++){putimage(0, ystart, buf[block], COPY_PUT);farfree(buf[block]);ystart = yend + 1;yend += yincr + 1;}}函数名: getlinesettings功能: 取当前线型、模式和宽度用法: void far getlinesettings(struct linesettingstype far *lininfo): 程序例:#include <graphics.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>/* the names of the line styles supported */char *lname[] = { "SOLID_LINE","DOTTED_LINE","CENTER_LINE","DASHED_LINE","USERBIT_LINE"};int main(void){/* request auto detection */int gdriver = DETECT, gmode, errorcode;struct linesettingstype lineinfo;int midx, midy;char lstyle[80], lpattern[80], lwidth[80];/* initialize graphics and local variables */initgraph(&gdriver, &gmode, "");/* read result of initialization */errorcode = graphresult();if (errorcode != grOk) /* an error occurred */{printf("Graphics error: %s\n", grapherrormsg(errorcode));printf("Press any key to halt:");getch();exit(1); /* terminate with an error code */}midx = getmaxx() / 2;midy = getmaxy() / 2;/* get information about current line settings */ getlinesettings(&lineinfo);/* convert line information into strings */sprintf(lstyle, "%s is the line style.",lname[lineinfo.linestyle]);sprintf(lpattern, "0x%X is the user-defined line pattern.", lineinfo.upattern);sprintf(lwidth, "%d is the line thickness.",lineinfo.thickness);/* display the information */settextjustify(CENTER_TEXT, CENTER_TEXT); outtextxy(midx, midy, lstyle);outtextxy(midx, midy+2*textheight("W"), lpattern); outtextxy(midx, midy+4*textheight("W"), lwidth);/* clean up */getch();closegraph();return 0;}函数名: getmaxcolor功能: 返回可以传给函数setcolor的最大颜色值用法: int far getmaxcolor(void);程序例:#include <graphics.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>{/* request auto detection */int gdriver = DETECT, gmode, errorcode;int midx, midy;char colstr[80];/* initialize graphics and local variables*/ initgraph(&gdriver, &gmode, "");/* read result of initialization */errorcode = graphresult();if (errorcode != grOk) /* an error occurred */{printf("Graphics error: %s\n", grapherrormsg(errorcode));printf("Press any key to halt:");getch();exit(1); /* terminate with an error code */}midx = getmaxx() / 2;midy = getmaxy() / 2;/* grab the color info. and convert it to a string */sprintf(colstr, "This mode supports colors 0..%d", getmaxcolor()); /* display the information */settextjustify(CENTER_TEXT, CENTER_TEXT);outtextxy(midx, midy, colstr);/* clean up */getch();closegraph();return 0;}函数名: getmaxx功能: 返回屏幕的最大x坐标用法: int far getmaxx(void);程序例:#include <graphics.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>{/* request auto detection */int gdriver = DETECT, gmode, errorcode;int midx, midy;char xrange[80], yrange[80];/* initialize graphics and local variables */initgraph(&gdriver, &gmode, "");/* read result of initialization */errorcode = graphresult();if (errorcode != grOk) /* an error occurred */{printf("Graphics error: %s\n", grapherrormsg(errorcode));printf("Press any key to halt:");getch();exit(1); /* terminate with an error code */}midx = getmaxx() / 2;midy = getmaxy() / 2;/* convert max resolution values into strings */sprintf(xrange, "X values range from 0..%d", getmaxx()); sprintf(yrange, "Y values range from 0..%d", getmaxy()); /* display the information */settextjustify(CENTER_TEXT, CENTER_TEXT); outtextxy(midx, midy, xrange);outtextxy(midx, midy+textheight("W"), yrange);/* clean up */getch();closegraph();return 0;}函数名: getmaxy功能: 返回屏幕的最大y坐标用法: int far getmaxy(void);程序例:#include <graphics.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>int main(void){/* request auto detection */int gdriver = DETECT, gmode, errorcode;int midx, midy;char xrange[80], yrange[80];/* initialize graphics and local variables */initgraph(&gdriver, &gmode, "");/* read result of initialization */errorcode = graphresult();if (errorcode != grOk) /* an error occurred */{printf("Graphics error: %s\n", grapherrormsg(errorcode));printf("Press any key to halt:");getch();exit(1); /* terminate with an error code */}midx = getmaxx() / 2;midy = getmaxy() / 2;/* convert max resolution values into strings */sprintf(xrange, "X values range from 0..%d", getmaxx()); sprintf(yrange, "Y values range from 0..%d", getmaxy()); /* display the information */settextjustify(CENTER_TEXT, CENTER_TEXT); outtextxy(midx, midy, xrange);outtextxy(midx, midy+textheight("W"), yrange);/* clean up */getch();closegraph();return 0;}函数名: getmodename功能: 返回含有指定图形模式名的字符串指针。

C语言标准库函数大全

C语言标准库函数大全
Arther's Blog
Page 1 of 22
博客园 社区 首页 新随笔 联系 管理 订阅
随笔- 208 文章- 0 评论14
c语言库函数大全--资料收集
Turbo C 2.0 函数中文说明大全
分类函数,所在函数库为ctype.h int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回非0值,否则返回0 int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或数字('0'-'9'),返回非0值, 否则返回0 int isascii(int ch) 若ch是字符(ASCII码中的0-127)返回非0值,否则返回0 int iscntrl(int ch) 若ch是作废字符(0x7F)或普通控制字符(0x00-0x1F),返 回非0值,否则返回0 int isdigit(int ch) 若ch是数字('0'-'9')返回非0值,否则返回0 int isgraph(int ch) 若ch是可打印字符(不含空格)(0x21-0x7E)返回非0值, 否则返回0 int islower(int ch) 若ch是小写字母('a'-'z')返回非0值,否则返回0 int isprint(int ch) 若ch是可打印字符(含空格)(0x20-0x7E)返回非0值,否 则返回0 int ispunct(int ch) 若ch是标点字符(0x00-0x1F)返回非0值,否则返回0 int isspace(int ch) 若ch是空格(' '),水平制表符('\t'),回车符('\r'), 走纸换 行('\f'),垂直制表符('\v'),换行符('\n'), 返回非0值,否则返回0 int isupper(int ch) 若ch是大写字母('A'-'Z')返回非0值,否则返回0 int isxdigit(int ch) 若ch是16进制数('0'-'9','A'-'F','a'-'f')返回非0值, 否则 返回0 int tolower(int ch) 若ch是大写字母('A'-'Z')返回相应的小写字母('a'-'z') int toupper(int ch) 若ch是小写字母('a'-'z')返回相应的大写字母('A'-'Z')

C语言练习-函数

C语言练习-函数

1. 单项选择题(1)在C语言程序中,下列叙述正确的是。

A. 函数的定义可以嵌套,但函数的调用不可以嵌套B. 函数的定义不可以嵌套,但函数的调用可以嵌套C. 函数的定义和调用都可以嵌套D. 函数的定义和调用均不可以嵌套【答】B(2)在C语言程序中,下列叙述错误的是。

A. 形参是局部变量B. 不同的函数中,可以使用相同名称的变量C. 在一个函数的内部,可以在复合语句中定义变量D. main()函数中定义的变量在整个文件或者程序中都有效【答】D(3)在C语言程序中,下列叙述正确的是。

A. 实参和对应的形参各占用独立的存储单元B. 实参和对应的形参共占用一个存储单元C. 形参是虚拟的,不占用存储单元D. 只有当实参和对应的形参同名时才共占用存储单元【答】A(4)在C语言程序中,下列叙述正确的是。

A. 实参可以是常量、变量或表达式B. 实参可以是任意类型C. 形参可以是常量、变量或表达式D. 形参与对应的实参类型要求可以不一致【答】A(5)在C语言程序中,简单变量做实参时,它和对应形参之间的数据传递方式是。

A. 地址传递B. 单向值传递C. 由用户指定传递方式D. 由实参传给形参,再由形参传回给实参【答】C语言函数调用时,只有单向的值传递,即实参将值传递给形参,传址调用也是一种单向的值传递,它是通过间接方式达到将形参回传给实参的。

本题答案为B。

(6)下列关于return语句说法正确的是。

A. 必须在每个函数中都出现B. 只能在除main()函数之外的函数中出现一次C. 可以在同一个函数中多次出现D. 在main()函数和其他函数中都可以出现【答】C(7)C语言中规定函数的返回值的类型是由。

A. return语句中的表达式类型所决定B. 调用该函数时的主调用函数类型所决定C. 调用该函数时系统临时决定D. 在定义该函数时所指定的函数类型所决定【答】D(8)如果要限制一个变量只能被本源文件中的函数使用,必须通过来实现。

C语言反汇编-函数与结构体

C语言反汇编-函数与结构体

C语⾔反汇编-函数与结构体反汇编(Disassembly) 即把⽬标⼆进制机器码转为汇编代码的过程,该技术常⽤于软件破解、外挂技术、病毒分析、逆向⼯程、软件汉化等领域,学习和理解反汇编对软件调试、系统漏洞挖掘、内核原理及理解⾼级语⾔代码都有相当⼤的帮助,软件⼀切神秘的运⾏机制全在反汇编代码⾥⾯。

函数是任何⼀个⾼级语⾔中必须要存在的⼀个东西,使⽤函数式编程可以让程序可读性更⾼,充分发挥了模块化设计思想的精髓,今天我将带⼤家⼀起来探索函数的实现机理,探索编译器到底是如何对函数这个关键字进⾏实现的,从⽽更好地理解编译⾏为。

先来研究函数,函数是任何⼀门编程语⾔中都存在的关键字,使⽤函数式编程可以让程序可读性更⾼,充分发挥模块化设计思想的精髓,⽽函数传参的底层实现就是通过堆栈来实现的,⾸先我们来理解⼀下堆栈.当有参函数被执⾏时,通常会根据不同的调⽤约定来对参数进⾏压栈存储以STDcall约定为例,栈的调⽤原则是先进后出,最先被push到堆栈中的数据会被最后释放出来,⽽CPU中有两个寄存器专门⽤于维护堆栈的变化,ESP栈顶寄存器,EBP栈底寄存器(基址),这两个寄存器就像是好基友,两个寄存器相互配合,来让堆栈有条不乱.栈帧:就是ESP -> EBP 之间的空间,通常是调⽤函数时,函数的参数,从⼀个函数切换到另⼀个函数上,栈帧也会发⽣变化,当函数调⽤结束后,则需要平栈帧,不然会发⽣访问冲突,平栈帧的过程都是有编译器来解决的。

逆向分析函数实现机制函数与堆栈的基础: 下⾯⼀个简单的函数调⽤案例,我们来看看汇编格式是怎样的.#include <stdio.h>int VoidFunction(){printf("hello lyshark\n");return 0;}int main(int argc, char* argv[]){VoidFunction();return 0;}编译上⾯的这段代码,⾸先我们找到main函数的位置,然后会看到call 0x4110E1这条汇编指令就是在调⽤VoidFunction()函数,观察函数能发现函数下⽅并没有add esp,xxx这样的指令,则说明平栈操作是在函数的内部完成的,我们直接跟进去看看函数内部到底做了什么见不得⼈的事情.0041142C | 8DBD 40FFFFFF | lea edi,dword ptr ss:[ebp-0xC0] |00411432 | B9 30000000 | mov ecx,0x30 |00411437 | B8 CCCCCCCC | mov eax,0xCCCCCCCC |0041143C | F3:AB | rep stosd |0041143E | E8 9EFCFFFF | call 0x4110E1 | 调⽤VoidFunction()00411443 | 33C0 | xor eax,eax | main.c:1300411445 | 5F | pop edi | main.c:14, edi:"閉\n"00411446 | 5E | pop esi | esi:"閉\n"00411447 | 5B | pop ebx |此时我们直接跟进call 0x4110E1这个函数中,分析函数内部是如何平栈的,进⼊函数以后⾸先使⽤push ebp保存当前EBP指针位置,然后调⽤mov ebp,esp这条指令来将当前的栈帧付给EBP也就是当基址使⽤,sub esp,0xC0则是分配局部变量,接着是push ebx,esi,edi则是因为我们需要⽤到这⼏个寄存器所以应该提前将原始值保存起来,最后⽤完了就需要pip edi,esi,ebx恢复这些寄存器的原始状态,并执⾏add esp,0xC0对局部变量进⾏恢复,最后mov esp,ebp还原到原始的栈顶指针位置,⾸尾呼应.004113C0 | 55 | push ebp | 保存栈底指针 ebp004113C1 | 8BEC | mov ebp,esp | 将当前栈指针给ebp004113C3 | 81EC C0000000 | sub esp,0xC0 | 抬⾼栈顶esp,开辟局部空间004113C9 | 53 | push ebx | 保存 ebx004113CA | 56 | push esi | 保存 esi004113CB | 57 | push edi | 保存 edi004113CC | 8DBD 40FFFFFF | lea edi,dword ptr ss:[ebp-0xC0] | 取出次函数可⽤栈空间⾸地址004113D2 | B9 30000000 | mov ecx,0x30 | ecx:"閉\n", 30:'0'004113D7 | B8 CCCCCCCC | mov eax,0xCCCCCCCC |004113DC | F3:AB | rep stosd |004113DE | 8BF4 | mov esi,esp | main.c:5004113E0 | 68 58584100 | push consoleapplication1.415858 | 415858:"hello lyshark\n"004113E5 | FF15 14914100 | call dword ptr ds:[<&printf>] | 调⽤printf004113EB | 83C4 04 | add esp,0x4 | 降低栈顶esp,释放printf局部空间004113EE | 3BF4 | cmp esi,esp | 检测堆栈是否平衡,ebp!=esp则不平衡004113F0 | E8 46FDFFFF | call 0x41113B | 堆栈检测函数:检测平衡,不平衡则报错004113F5 | 33C0 | xor eax,eax | main.c:6004113F7 | 5F | pop edi | 还原寄存器edi004113F8 | 5E | pop esi | 还原寄存器esi004113F9 | 5B | pop ebx | 还原寄存器ebx004113FA | 81C4 C0000000 | add esp,0xC0 | 恢复esp,还原局部变量00411400 | 3BEC | cmp ebp,esp |00411402 | E8 34FDFFFF | call 0x41113B |00411407 | 8BE5 | mov esp,ebp | 还原原始的ebp指针00411409 | 5D | pop ebp |0041140A | C3 | ret |上⽅的代码其实默认⾛的是STDCALL的调⽤约定,⼀般情况下在Win32环境默认遵循的就是STDCALL,⽽在Win64环境下使⽤的则是FastCALL,在Linux系统上则遵循SystemV的约定,这⾥我整理了他们之间的异同点.这⾥我们来演⽰CDECL的调⽤约定,其实我们使⽤的Printf()函数就是在遵循__cdecl()约定,由于Printf函数可以有多个参数传递,所以只能使⽤__cdecl()约定来传递参数,该约定的典型特点就是平栈不在被调⽤函数内部完成,⽽是在外部通过使⽤⼀条add esp,0x4这种⽅式来平栈的.004113E0 | 68 58584100 | push consoleapplication1.415858 | 415858:"hello lyshark\n"004113E5 | FF15 14914100 | call dword ptr ds:[<&printf>] |004113EB | 83C4 04 | add esp,0x4 | 平栈004113EE | 3BF4 | cmp esi,esp |004113F0 | E8 46FDFFFF | call 0x41113B |004113F5 | 8BF4 | mov esi,esp | main.c:6004113F7 | 68 58584100 | push consoleapplication1.415858 | 415858:"hello lyshark\n"004113FC | FF15 14914100 | call dword ptr ds:[<&printf>] | 平栈00411402 | 83C4 04 | add esp,0x4 |在使⽤Release版对其进⾏优化的话,此段代码将会采取复写传播优化,将每次参数平衡的操作进⾏归并,⼀次性平衡栈顶指针esp,从⽽可以⼤⼤的提⾼程序的执⾏效率,汇编代码如下:004113E0 | 68 58584100 | push consoleapplication1.415858 | 415858:"hello lyshark\n"004113E5 | FF15 14914100 | call dword ptr ds:[<&printf>] |004113F7 | 68 58584100 | push consoleapplication1.415858 | 415858:"hello lyshark\n"004113FC | FF15 14914100 | call dword ptr ds:[<&printf>] |00411402 | 83C4 04 | add esp,0x8 | ⼀次性平栈加上0x8,平了前⾯的2个push通过以上分析发现_cdecl与_stdcall两者只在参数平衡上有所不同,其余部分都⼀样,但经过优化后_cdecl调⽤⽅式的函数在同⼀作⽤域内多次使⽤,会在效率上⽐_stdcall髙,这是因为_cdecl可以使⽤复写传播,⽽_stdcall的平栈都是在函数内部完成的,⽆法使⽤复写传播这种优化⽅式.除了前⾯的两种调⽤约定以外_fastcall调⽤⽅式的效率最髙,其他两种调⽤⽅式都是通过栈传递参数,唯独_fastcall可以利⽤寄存器传递参数,但由于寄存器数⽬很少,⽽参数相⽐可以很多,只能量⼒⽽⾏,故在Windows环境中_fastcall的调⽤⽅式只使⽤了ECX和EDX寄存器,分别传递第1个参数和第2个参数,其余参数传递则依然使⽤堆栈传递.#include <stdio.h>void _fastcall VoidFunction(int x,int y,int z,int a){printf("%d%d%d%d\n", x, y, z, a);}int main(int argc, char* argv[]){VoidFunction(1,2,3,4);return 0;}反汇编后观察代码发现call 0x4110E6就是在调⽤我们的VoidFunction()函数在调⽤之前分别将参数压⼊了不同的寄存器和堆栈中,接着我们继续跟进到call函数内部,看它是如何取出参数的.0041145E | 6A 04 | push 0x4 | 第四个参数使⽤堆栈传递00411460 | 6A 03 | push 0x3 | 第三个参数使⽤堆栈传递00411462 | BA 02000000 | mov edx,0x2 | 第⼆个参数使⽤edx传递00411467 | B9 01000000 | mov ecx,0x1 | 第⼀个参数使⽤ecx传递0041146C | E8 75FCFFFF | call 0x4110E6 |00411471 | 33C0 | xor eax,eax | main.c:11进⼊call 0x4110E6这个函数中,观察发现⾸先会通过mov指令将前两个参数提取出来,然后再从第四个参数开始依次将参数取出来并压栈,最后让Printf函数成功调⽤到.004113E0 | 8955 EC | mov dword ptr ss:[ebp-0x14],edx | edx => 提取出第⼆个参数004113E3 | 894D F8 | mov dword ptr ss:[ebp-0x8],ecx | ecx => 提取出第⼀个参数004113E6 | 8BF4 | mov esi,esp | main.c:5004113E8 | 8B45 0C | mov eax,dword ptr ss:[ebp+0xC] | 保存第四个参数004113EB | 50 | push eax |004113EC | 8B4D 08 | mov ecx,dword ptr ss:[ebp+0x8] | 保存第三个参数004113EF | 51 | push ecx |004113F0 | 8B55 EC | mov edx,dword ptr ss:[ebp-0x14] | 保存第⼆个参数004113F3 | 52 | push edx |004113F4 | 8B45 F8 | mov eax,dword ptr ss:[ebp-0x8] | 保存第⼀个参数004113F7 | 50 | push eax |004113F8 | 68 58584100 | push consoleapplication1.415858 | 415858:"%d%d%d%d\n"004113FD | FF15 14914100 | call dword ptr ds:[<&printf>] |00411403 | 83C4 14 | add esp,0x14 | 平栈定义并使⽤有参函数: 我们给函数传递些参数,然后分析其反汇编代码,观察代码的展⽰形式.#include <stdio.h>int Function(int x,float y,double z){if (x = 100){x = x + 100;y = y + 100;z = z + 100;}return (x);}int main(int argc, char* argv[]){int ret = 0;ret = Function(100, 2.5, 10.245);printf("返回值: %d\n", ret);return 0;}下⽅的反汇编代码就是调⽤函数ret = Function()的过程,该过程中可看出压栈顺序遵循的是从后向前压⼊的.0041145E | C745 F8 00000000 | mov dword ptr ss:[ebp-0x8],0x0 | main.c:1700411465 | 83EC 08 | sub esp,0x8 | main.c:1800411468 | F2:0F1005 70584100 | movsd xmm0,qword ptr ds:[<__real@40247d70a3d70a3d>] | 将10.245放⼊XMM0寄存器00411470 | F2:0F110424 | movsd qword ptr ss:[esp],xmm0 | 取出XMM0中内容,并放⼊堆栈00411475 | 51 | push ecx |00411476 | F3:0F1005 68584100 | movss xmm0,dword ptr ds:[<__real@40200000>] | 将2.5放⼊XMM00041147E | F3:0F110424 | movss dword ptr ss:[esp],xmm0 | 同理00411483 | 6A 64 | push 0x64 | 最后⼀个参数10000411485 | E8 51FDFFFF | call 0x4111DB | 调⽤Function函数0041148A | 83C4 10 | add esp,0x10 |0041148D | 8945 F8 | mov dword ptr ss:[ebp-0x8],eax | 将返回值压栈00411490 | 8BF4 | mov esi,esp | main.c:1900411492 | 8B45 F8 | mov eax,dword ptr ss:[ebp-0x8] |00411495 | 50 | push eax |00411496 | 68 58584100 | push consoleapplication1.415858 | 415858:"返回值: %d\n"0041149B | FF15 14914100 | call dword ptr ds:[<&printf>] | 输出结果004114A1 | 83C4 08 | add esp,0x8 |压栈完成以后我们可以继续跟进call 0x4111DB这个关键CALL,此处就是运算数据的关键函数,跟进去以后,可发现其对浮点数的运算,完全是依靠XMM寄存器实现的.004113F1 | 8945 08 | mov dword ptr ss:[ebp+0x8],eax |004113F4 | F3:0F1045 0C | movss xmm0,dword ptr ss:[ebp+0xC] | main.c:8004113F9 | F3:0F5805 8C584100 | addss xmm0,dword ptr ds:[<__real@42c80000>] |00411401 | F3:0F1145 0C | movss dword ptr ss:[ebp+0xC],xmm0 |00411406 | F2:0F1045 10 | movsd xmm0,qword ptr ss:[ebp+0x10] | main.c:90041140B | F2:0F5805 80584100 | addsd xmm0,qword ptr ds:[<__real@4059000000000000>] |00411413 | F2:0F1145 10 | movsd qword ptr ss:[ebp+0x10],xmm0 |00411418 | 8B45 08 | mov eax,dword ptr ss:[ebp+0x8] | main.c:11向函数传递数组/指针: 这⾥我们以⼀维数组为例,⼆维数组的传递其实和⼀维数组是相通的,只不过在寻址⽅式上要使⽤⼆维数组的寻址公式,此外传递数组其实本质上就是传递指针,所以数组与指针的传递⽅式也是相通的.#include <stdio.h>void Function(int Array[], int size){for (int i = 0; i<size; ++i){printf("输出元素: %d \n", Array[i]);}}int main(int argc, char* argv[]){int ary[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };Function(ary, 10);return 0;}以下代码就是Function(ary,10)函数的调⽤代码,⾸先压栈传递0A也就是10,接着传递ary⾸地址,最后调⽤call指令.004114B4 | 6A 0A | push 0xA | 10004114B6 | 8D45 D4 | lea eax,dword ptr ss:[ebp-0x2C] | ary ⾸地址004114B9 | 50 | push eax | push eax004114BA | E8 63FCFFFF | call 0x411122 | 调⽤Function()004114BF | 83C4 08 | add esp,0x8 | 堆栈修复函数中返回指针,其实就是返回⼀个内存地址,我们可以打印出这个内存地址具体的值,如下是⼀段测试代码,这⾥的原理于上⽅都是相通的,此处就不在浪费篇幅了.#include <stdio.h>int GetAddr(int number){int nAddr;nAddr = *(int*)(&number-1);return nAddr;}int main(int argc, char* argv[]){int address = 0;address = GetAddr(100);printf("%x\n",address);return 0;}函数的参数传递就到此结束了,其实其他的参数传递⽆外乎就是上⾯的这⼏种传递形式,只是在某些实现细节上略有差异,但⼤体上也就是这些东西,在真正的逆向过程中还需要考虑编译器的版本等具体细节,每⼀个编译器在实现参数传递上都略微不同,这也就是编译特性所影响的,我们应该灵活运⽤这些知识,才能更好地分析这些字节码.变量作⽤域解析接着我们来研究⼀下变量的作⽤域,在C语⾔中作⽤域可分为局部变量与全局变量,两种变量⼜分为静态变量和动态变量,接下来我们将通过反汇编学习研究他们之间的异同点.探索全局变量的奥秘: 全局变量与常量有很多相似的地⽅,两者都是在程序执⾏前就存在的,这是因为编译器在编译时就将其写⼊到的程序⽂件⾥,但是在PE⽂件中的只读数据节⾥,常量的节属性被修饰为不可写⼊,⽽全局变量和静态变量的属性为可读可写,PE⽂件加载器在加载可执⾏⽂件时,会率先装载这些常量与全局变量,然后才会运⾏程序⼊⼝代码,因此这些全局变量可以不受作⽤域的影响,在程序中的任何位置都可以被访问和使⽤,来看⼀段C代码:#include <stdio.h>int number1 = 1;int number2 = 2;int main(int argc, char* argv[]){scanf("%d", &number1);printf("您输⼊的数字: %d\n", number1);number2 = 100;return 0;}如下反汇编代码可以看出,全局变量的访问是直接通过⽴即数push consoleapplication1.415858访问的,此⽴即数是通过编译器编译时就写⼊到了程序中的,所以也就可以直接进⾏访问了.004113E0 | 68 00804100 | push <consoleapplication1._number1> | 此处的压栈参数就是全局变量004113E5 | 68 58584100 | push consoleapplication1.415858 | 415858:"%d"004113EA | FF15 10914100 | call dword ptr ds:[<&scanf>] |004113F0 | 83C4 08 | add esp,0x8 | 保存第⼆个参数004113F3 | 3BF4 | cmp esi,esp |004113F5 | E8 41FDFFFF | call 0x41113B |004113FA | 8BF4 | mov esi,esp | main.c:9004113FC | A1 00804100 | mov eax,dword ptr ds:[<_number1>] |00411401 | 50 | push eax |00411402 | 68 5C584100 | push consoleapplication1.41585C | 41585C:"您输⼊的数字: %d\n"00411407 | FF15 18914100 | call dword ptr ds:[<&printf>] |0041140D | 83C4 08 | add esp,0x8 |00411410 | 3BF4 | cmp esi,esp |00411412 | E8 24FDFFFF | call 0x41113B |00411417 | C705 04804100 64000000 | mov dword ptr ds:[<_number2>],0x64 | main.c:11, 64:'d'00411421 | 33C0 | xor eax,eax | main.c:12探索局部变量的奥秘: 局部变量的访问是通过栈指针相对间接访问,也就是说局部变量是程序动态创建的,通常是调⽤某个函数或过程时动态⽣成的,局部变量作⽤域也仅限于函数内部,且其地址也是⼀个未知数,编译器⽆法预先计算.#include <stdio.h>int main(int argc, char* argv[]){int num1 = 0;int num2 = 1;scanf("%d", &num1);printf("%d", num1);num2 = 10;return 0;}反汇编代码,局部变量就是通过mov dword ptr ss:[ebp-0x8],0x0动态开辟的空间,其作⽤域就是在本函数退出时消亡.004113DE | C745 F8 00000000 | mov dword ptr ss:[ebp-0x8],0x0 | 申请局部变量004113E5 | C745 EC 01000000 | mov dword ptr ss:[ebp-0x14],0x1 | main.c:6004113EC | 8BF4 | mov esi,esp | main.c:8004113EE | 8D45 F8 | lea eax,dword ptr ss:[ebp-0x8] |004113F1 | 50 | push eax |004113F2 | 68 58584100 | push consoleapplication1.415858 | 415858:"%d"004113F7 | FF15 10914100 | call dword ptr ds:[<&scanf>] |说到局部变量,不得不提起局部静态变量,局部静态变量的声明只需要使⽤static关键字声明,该变量⽐较特殊,他不会随作⽤域的结束⽽消亡,并且也是在未进⼊作⽤域之前就已经存在了,其实局部静态变量也是全局变量,只不过它的作⽤域被限制在了某⼀个函数内部⽽已,所以它本质上还是全局变量,来⼀段代码验证⼀下:#include <stdio.h>int main(int argc, char* argv[]){static int g_number = 0;for (int x = 0; x <= 10; x++){g_number = x;printf("输出: %d\n", g_number);}return 0;}观察这段反汇编代码,你能够清晰的看出,同样是使⽤mov eax,dword ptr ds:[<g_number>]从全局数据区取数据的,这说明局部变量声明为静态属性以后,就和全局变量变成了⼀家⼈了.004113DE | C745 F8 00000000 | mov dword ptr ss:[ebp-0x8],0x0 | main.c:7004113E5 | EB 09 | jmp 0x4113F0 |004113E7 | 8B45 F8 | mov eax,dword ptr ss:[ebp-0x8] |004113EA | 83C0 01 | add eax,0x1 |004113ED | 8945 F8 | mov dword ptr ss:[ebp-0x8],eax |004113F0 | 837D F8 0A | cmp dword ptr ss:[ebp-0x8],0xA | A:'\n'004113F4 | 7F 27 | jg 0x41141D |004113F6 | 8B45 F8 | mov eax,dword ptr ss:[ebp-0x8] | main.c:9004113F9 | A3 30814100 | mov dword ptr ds:[<g_number>],eax |004113FE | 8BF4 | mov esi,esp | main.c:1000411400 | A1 30814100 | mov eax,dword ptr ds:[<g_number>] | 与全局变量是⼀家⼈00411405 | 50 | push eax |00411406 | 68 58584100 | push consoleapplication1.415858 | 415858:"输出: %d\n"0041140B | FF15 14914100 | call dword ptr ds:[<&printf>] |00411411 | 83C4 08 | add esp,0x8 |00411414 | 3BF4 | cmp esi,esp |00411416 | E8 1BFDFFFF | call 0x411136 |0041141B | EB CA | jmp 0x4113E7 | main.c:110041141D | 33C0 | xor eax,eax | main.c:12探索堆变量的奥秘: 堆变量是最容易识别的⼀种变量类型,因为分配堆区的函数就⼏个calloc/malloc/new等,所以这类变量往往能被调试器直接补货到,这种变量同样属于局部变量的范畴,因为它也是通过函数动态申请的⼀段内存空间,这⾥只给出⼀个案例吧,反编译⼤家可以⾃⼰研究,这⼀个是很简单的了.#include <stdlib.h>#include <stdio.h>int main(int argc, char* argv[]){int *pMalloc = (int*)malloc(10);printf("变量地址: %x", pMalloc);free(pMalloc);return 0;}结构体与共⽤体针对C语⾔的反汇编,就剩⼀个结构体与共⽤体了,这⾥的内容⽐较少,我就不再新的⽂章⾥写了,直接在这⾥把它给写完,C语⾔的反汇编就到此结束。

写出c语言程序中函数的一般结构形式

写出c语言程序中函数的一般结构形式

写出c语言程序中函数的一般结构形式
函数的一般结构形式为:
返回值类型函数名(参数类型1 参数1, 参数类型2 参数2, ...) { 函数体语句;
...
return 返回值;
}
其中:
- 返回值类型:指定函数返回值的数据类型,可以是基本类型(如int, char, double等)或结构体类型。

- 函数名:函数的标识符,命名规则与变量相同。

- 参数类型和参数名称:定义传递给函数的参数,可以有多个参数,每个参数包括参数类型和参数名称。

- 函数体语句:实现函数功能的语句集合。

- return语句:指定函数的返回值,可以省略或返回void类型。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言(函数,变量作用范围)二1 C语言程序由函数组成,以下说法正确的是( A ).A)主函数可以在其它函数之前,函数内不可以嵌套定义函数B)主函数可以在其它函数之前,函数内可以嵌套定义函数C)主函数必须在其它函数之前,函数内不可以嵌套定义函数D)主函数必须在其它函数之前,函数内可以嵌套定义函数2 以下说法中不正确的是( A )。

A) 主函数main中定义的变量在整个文件或程序中有效B) 不同的函数中可以使用相同名字的变量C) 形式参数是局部变量D) 在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效3 下面函数f(double x){printf(“%6d\n”,x);}的类型为( C ).A) 实型B)void 类型C)int 类型 D) A)、B)、C)均不正确4 以下说法中正确的是( C ).A)C语言程序总是从第一个定义的函数开始执行B)在C语言程序中,要调用的函数必须在main函数中定义C)C语言程序总是从main函数开始执行D)C语言程序中,main函数必须放在程序的开始部分5 以下正确的函数定义是( C ).A) double fun(int x,int y);{int z;z=x+y; return z;}B) fun(int x,y){int z; return z;}C) double fun(int x,int y){double z;z=x+y; return z;}D) double fun( x, y){int x,y;double z;z=x+y; return z;}6 定义为void类型的函数,其含义是( A ).A)调用函数后,被调用的函数没有返回值B)调用函数后,被调用的函数不返回C)调用函数后,被调用的函数的返回值为任意的类型D)以上三种说法都是错误的7 设有如下定义:int x=10,y=3,z ;则语句printf("%d\n",z=(x%y,x/y));的输出结果是( D ).A) 1 B)0 C) 4 D)38 在C语言的函数中,( C )。

A)必须有形参B)形参必须是变量名C)可以有也可以没有形参D)数组名不能作形参9 函数调用语句f((x,y),(a,b,c),(1,2,3,4));中,所含的实参个数是( C ).A) 1 B) 2 C) 3 D) 410 如果函数的首部省略了函数返回值的类型名,则函数被默认为( C )。

A)void类型B)空类型C)int类型D)char类型11 用数组名做函数的参数,实际上传递给形参的是( A ).A) 数组元素的首地址B) 数组的第一个元素的值C) 每一个数组元素D)整个数组的个数12 C语言允许函数值类型缺省定义,此时该函数值隐含的类型是( B ).A)floatB)intC)long intD)void13 已有以下数组定义和f函数调用语句,则在f函数的说明中,对形参数组array的错误定义方式是( B ).int a[3][4];f(a);A)f(int array[ ][6])B)f(int array[ 3][ ])C)f(int array[ ][4])D)f(int array[ 2][5])14 下列说法中正确的是( D ).A)调用函数时,实参变量与形参变量可以共用内存单元B)调用函数时,实参的个数、类型和顺序与形参可以不一致C)调用函数时,形参可以是表达式D)调用函数时,将为形参分配内存单元15 下列语句中,不正确的是( D )。

A)c=2*max(a,b); B)m=max(a,max(b,c));C)printf("%d",max(a,b)); D)int max(int x,int max(int y,int z));16 以下函数调用语句:fun(x+y,x-y);中实际参数的个数是( B ).A) 1 B) 2 C) 4 D)517 C语言可执行程序开始执行点为( C ).A)程序中第一条可执行语句B) 程序中第一个函数C)程序中的main函数D) 包含文件中的第一个函数18 若调用一个函数,且此函数中无return语句,则正确的说法是( D ).A) 没有返回值;B) 返回若干个系统默认值;C) 能返回一个用户所希望的函数值;D) 返回一个不确定的值19 执行下列程序后, 变量i 的值应为( A ).int ma(int x,int y){return x*y;}main(){ int i;i = 5;i = ma(i,i-1)-7;}A) 13 B) 17 C) 19 D) 以上都错20 下列程序的结果为( ).change(int x,int y){int t;t=x;x=y;y=t;}main(){int x=2,y=3;change(x,y);printf("x=%d,y=%d\n",x,y);}A) x=3,y=2 B) x=2,y=3 C) x=2,y=2 D) x=3,y=321 执行下列程序后, 变量a的值应为( D ).int f(int x){return x+3;}main(){int a=1;while(f(a)<10)a++;}A) 11 B) 10 C) 9 D) 722 若有以下函数定义,则在主函数中正确的调用语句是( C ). void fun(int array[][5]){ ………..}main(){ int a[3][5], b;……..}A)fun(a[3][5]);B)b=fun(a);C) fun(a);D) fun(a)23 C语言中的函数( D ).A)可以嵌套定义。

B)不可以嵌套调用。

C)可以嵌套调用,但不能递归调用。

D)嵌套调用和递归调用均可。

24 C语言中( A )函数的递归调用.A) 允许B) 不允许25 对于以下递归函数f, 调用f(4),其返回值为( B ).int f(int n){ if (n)return f(n-1)+n;elsereturn n;}A) 8 B) 10 C) 11 D) 1226以下说法中正确的是( C ).A)形参是全局变量,其作用范围仅限于函数内部B)形参是全局变量,其作用范围从定义之处到文件结束。

C)形参是局部变量,其作用范围仅限于函数内部D)形参是局部变量,其作用范围从定义之处到文件结束。

27 以下正确的说法是:建立函数的目的之一是( B ).A) 提高程序的执行效率;B) 提高程序的可读性C) 减少程序的篇幅;D) 减少程序文件所占内存28 执行下列语句后,a的值为( C ).int a=12, b=7;m(int a,int b){a=b;}main(){m(a,b);}A) 0 B) 1 C) 12 D) 729 全局变量的有效范围为(D ).A) 该程序的所有文件B) 从本源文件的开始到结束C) 该程序的主函数D) 从定义变量的位置开始到本源文件结束1 f( int m ){int i, j;for( i=0; i<m; i++ )for( j=m-1; j>=0; j--)printf("%1d%c",i+j, j?'*':'#');}如果调用f(3)将输出【2*1*0#3*2*1#4*3*2# 】C语言(函数,变量作用范围)三1 下列定义不正确的有( C ) 。

A)#define PI 3.141592 B)#define S 345C)int max(x,y); D)char c;int x,y ;{ }2 下列程序结构中,不正确的是( B )。

A)main() B)main(){float a,b,c; {float a,b,c;scanf("%f,%f",&a,&b); scanf("%f,%f",&a,&b);c=add(a,b); c=add(a,b);...... .....} }int add(float x,float y) float add(float x,float y){ ... } { ... }C)float add(float x,float y); D)float add(float x,float y) main() { ... }{float a,b,c; main()scanf("%f,%f",&a,&b); {float a,b,c;c=add(a,b); scanf("%f,%f",&a,&b);...... c=add(a,b);} .....float add(float x,float y) }{ ... }3 一个C语言的程序总是从( A )开始执行的.A)main函数B)文件中的第一个函数C)文件中的第一个子函数调用D)文件中的第一条语句4 以下正确的函数定义是( D ).A)double fun(int x,int y){z=x+y; return z;}B) double fun(int x,int y);{int z;z=x+y; return z;}C) fun(int x,y){int z; return z;}D) double fun(int x,int y){double z;z=x+y; return z;}5 以下正确的函数声明形式是( D ).A)double fun(int x,int y)B) double fun(int x;int y)C) double fun(int ,int )D) double fun(int ,int );6 以下说法中正确的是( A )在C语言中A)实参与其对应的形参各占用独立的存储单元B)实参与其对应的形参占用同一个存储单元C)只有当实参与形参同名时才占用同一个存储单元D)实参占用存储单元,但形参是虚拟的,不占用存储单元7 设有如下函数定义:int f(char *s){ char *p=s ;while(*p!='\0') p++;return(p-s) ;}如果在主程序中用下面的语句调用上述函数,则输出结果为( A ).printf("%d\n",f("goodbye!"));的输出结果是A) 3 B) 6 C) 8 D) 08 下面程序段中,主函数中变量a被初始化为( C )。

int f(){return 3.5;}main(){int a=f();}A)3.5 B)无确定值C)3 D)程序出错9 下面叙述不正确的是( D ).A) 在函数中,通常用return语句传回函数值;B) 在函数中,可以有多条return语句;C) 在C中,主函数main后的一对圆括号中也可以带有形参;D) 在C中,调用函数必须在一条独立的语句中完成;10 C语言函数返回值的类型是由( B )决定的。

相关文档
最新文档