当前位置:文档之家› C语言中使用extern修饰函数要注意

C语言中使用extern修饰函数要注意

C语言中使用extern修饰函数要注意
C语言中使用extern修饰函数要注意

C语言中使用extern修饰函数要注意

用extern修饰函数是表示被修饰的函数定义在当前文件外,而该函数用extern声明类型后就可以被当前文件调用了。使用extern修饰某函数时,对该函数的调用是在连接阶段才被处理的。下面我们看一段代码。

/***********************************************

* fun.c

***********************************************/

#include

void fun (int n)

{

printf("%d/n");

}

/***********************************************

* test.c

***********************************************/

extern void fun (void);

int main ()

{

fun();

return 0;

}

着两个文件能编译连接到一起吗?答案是肯定的,而且不会出现警告。那我们运行这个程序看看什么结果:

C:/> test.exe

2367460

这个数从哪来的?不知道。这是因为我们调用了一个需要参数的函数而没有传递参数给它,而这个函数还傻乎乎的以为传过了参数,从寄存器里读出它的参数就去干活了。那个寄存器里是什么值?谁也说不准。如果fun函数的参数是作为指针使用……,啊!麻烦大了!

要解决问题,对于上面的小程序,我们直接冲过去改掉就成了。但是如果你的程序里有1000个文件,平均每个文件5000行(真正大的项目要比这大的多),那你还能一行行检查下去吗?如果调试过程中出了问题而你还不知道是这个原因导致的,如果你的程序很少运行到这个地方,……

所以,正确的方法是防患于未然,写代码是养成良好的习惯。

对于使用gcc的朋友,建议总是使用“-Wall”,“-Wall”是一个细心的秘书,他会及时提醒你代码中存在的风险。

尽量避免使用extern修饰函数。一般情况下,如果我们希望某个函数可以被外界使用,就创建一个头文件,在其中声明该函数的类型。哪个程序需要调用这个函数就把它的头文件包含进去。这样一来如果调用的地方使用不当,在编译阶段就会提示错误,也节省了时间。而且,定义函数和声明函数是同一个人做的,出错的机会也就小了。

变量

在讲变量前,先解释一下声明和定义这两个概念。声明一个变量意味着向编译器描述变量的

类型,但并不为变量分配存储空间。定义一个变量意味着在声明变量的同时还要为变量分配存储空间。在定义一个变量的同时还可以对变量进行初始化。

局部变量通常只定义不声明,而全局变量多在源文件中定义,在头文件中声明。

局部变量

在一个函数的内部定义的变量是内部变量,它只在本函数范围内有效。

自动变量auto

函数中的局部变量,其缺省格式是自动变量类型。例如,在函数体中int b, c=3; 和auto int b, c=3; 是等价的。

自动变量是动态分配存储空间的,函数结束后就释放。自动变量如不赋初值,则它的值是一个不确定的值。

静态局部变量static

静态局部变量是指在函数体内声明和定义的局部变量,它仅供本函数使用,即其他函数不能调用它。静态局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次函数调用时,该变量已有值,就是上一次函数调用结束时的值。

静态局部变量在静态存储区分配存储单元,在程序的整个运行期间都不释放。静态局部变量是在编译时赋初值的,即只赋初值一次。

在SDT编译器中,建议对静态局部变量赋初值,否则该静态局部变量的初值为不确定值。在其他编译器中,未初始化的静态局部变量的初值可能为零,这由具体的编译器所决定,使用前最好测试一下。

寄存器变量register

带register修饰符的变量暗示(仅仅是暗示而不是命令)编译程序本变量将被频繁使用,如果可能的话,应将其保留在CPU的寄存器中,以加快其存取速度。

对于现有的大多数编译程序,最好不要使用register修饰符。因为它是对早期低效的C编译程序的一个很有价值的补充。随着编译程序技术的进步,在决定哪些变量应当被存到寄存器中时,现在的C编译程序能比程序员做出更好的决定。

全局变量

在函数之外定义的变量称为外部变量,外部变量是全局变量,它可以为本文件中其他函数所共用。全局变量都是静态存储方式,都是在编译时分配内存,但是作用范围有所不同。

静态外部变量static

静态外部变量只能在本文件中使用。所以静态外部变量应该在当前源文件中声明和定义。外部变量extern

定义函数中的全局变量时,其缺省格式是外部变量类型。外部变量应该在一个头文件中声明,在当前源文件中定义。外部变量允许其他文件引用。

下例声明了一个变量和一个结构,定义了两个变量,其中一个定义带初始化:

extern int decl1; // this is a declaration

struct decl2

{

int member;

}; // this just declares the type – no variable mentioned

int def1 = 8; // this is a definition

int def2; // this is a definition

函数

内部函数的声明和定义多在当前源文件中完成;而外部函数通常在源文件中定义,在头文件中声明。

内部函数

只在当前源文件中使用的函数应该说明为内部函数。内部函数应该在当前源文件中声明和定义。若内部函数在头文件中声明,其他源文件通过包含这个头文件也可使用这个函数,但这样就失去了其做为内部函数的意义。

优点:使用内部函数,可以使函数只局限于所在文件。这避免了与其他源文件中可能出现的同名函数发生冲突。

例:

File:function1.c

#include “function1.h”

static int stat_func(void);

void MasterFunction(void)

{

rc = stat_func( );

}

static int stat_func(void)

{

return rc;

}

外部函数

对于可在当前源文件以外使用的函数,应该在一个头文件中声明。其他源文件可通过包含这个头文件或进行声明来使用这些函数(推荐用前者)。

一个良好的编程习惯是在头文件中声明函数的原型。这可方便编译程序查错。定义函数时,缺省的函数类型是外部函数。如:void fun2(void); 和extern void fun2(void); 其函数类型是等价的,但前一个是定义函数,后一个是声明函数。

小结

编写程序,尤其是大型程序时,建议采用上文所述的方法对不同的变量、函数进行必要的声明、定义。做好这些细节上的事务,可以为您的编程、调试、移植等带来很大的方便。extern

在声明的时候,extern可以被省略,很难搞清楚到底是声明还是定义,下面分变量和函数两类来说:

(1)变量

extern int a;//声明一个全局变量a

int a; //定义一个全局变量a

extern int a =0 ;//定义一个全局变量a 并给初值。

int a =0;//定义一个全局变量a,并给初值,

第四个等于第三个,都是定义一个可以被外部使用的全局变量,并给初值。

糊涂了吧,他们看上去可真像。但是定义只能出现在一处。也就是说,不管是int a;还是extern int a=0;还是int a=0;都只能出现一次,而那个extern int a可以出现很多次。

当你要引用一个全局变量的时候,你就要声明,extern int a;这时候extern不能省略,因为省略了,就变成int a;这是一个定义,不是声明。

(2)函数

对于函数也一样,也是定义和声明,定义的时候用extern,说明这个函数是可以被外部引用的,声明的时候用extern说明这是一个声明。但由于函数的定义和声明是有区别的,定义函数要有函数体,声明函数没有函数体,所以函数定义和声明时都可以将extern省略掉,反正其他文件也是知道这个函数是在其他地方定义的,所以不加extern也行。两者如此不同,所以省略了extern也不会有问题。

比如:

int fun(void)

{

return 0;

}

很好,我们定义了一个全局函数

int fun(void);

我们对它做了个声明,然后后面就可以用了

加不加extern都一样

我们也可以把对fun的声明放在一个头文件里,最后变成这样

int fun(void);//函数声明,所以省略了extern,完整些是extern int fun(void);

int fun(void)

{

return 0;

}//一个完整的全局函数定义,因为有函数体,extern同样被省略了。

然后,一个客户,一个要使用你的fun的客户,把这个头文件包含进去,ok,一个全局的声明。没有问题。

但是,对应的,如果是这个客户要使用全局变量,那么要extern 某某变量;不然就成了定义了。

总结如下:

对变量而言,如果你想在本源文件中使用另一个源文件的变量,就需要在使用前用extern 声明该变量,或者在头文件中用extern声明该变量;

对函数而言,如果你想在本源文件中使用另一个源文件的函数,就需要在使用前用声明该变量,声明函数加不加extern都没关系,所以在头文件中函数可以不用加extern。

C语言中产生随机数的方法

C语言中产生随机数的方法 引例:产生10个[100-200]区间内的随机整数。 #include #include //rand函数的头文件 #include //时间函数的头文件 int main() { int i; //循环变量 srand((unsigned) time(NULL)); //产生随机数的起始数据(以时间为种子) for (i=0; i<10; i++) //printf("%d\n", rand()); //产生[0,0x7fff)即[0,32767)以内的随机整数 //printf("%d\n", rand()%100); //产生0-99的随机整数 printf("%d\n", rand()%(200-100+1) + 100); //产生[100,200]内的随机整数return 0; } 在C语言中产生随机数需要以下几个函数的配合使用。 (1)rand函数——产生伪随机数 原型:int rand(void) 头文件:stdlib.h 功能:产生从0到RAND_MAX之间的随机数。RAND_MAX的值通常是0x7fff(十六进制数7FFF,也就是十进制数32767)。 例: #include #include int main() { int k; k = rand(); printf("%d\n", k); return 0; } 编译运行,发现每次运行程序产生的随机数都是一样的。 计算机中产生随机数,实际是采用一个固定的数作为“种子”,在一个给定的复杂算法中计算结果,所以叫“伪随机数”。 C语言中由于采用固定的序列作为种子,所以每次执行所取的是同一个数。 为上面的例子增加一个循环结构: #include #include int main() { int k,i;

C语言计时函数

C语言计时函数 (2012-05-16 09:30:18) 转载▼ 分类:c*cpp 标签: 杂谈 1. 中函数clock(),返回类型clock_t,精确度,毫秒级别 实例: #include #include #include void test() { int i = 0; int j = 0; double a = 0; while (i++ < 1000000) while (j++ < 1000000) { a = sqrt(2.0); } } int main(void) { clock_t start, finish; double duration = 0.0; start = clock(); test(); finish = clock(); duration = (double)(finish - start);输出单位ms duration = (double)(finish - start) / CLOCKS_PER_SEC; //输出单位为妙,精确到毫秒级 //#define CLOCKS_PER_SEC 1000 printf("%f seconds\n", duration);

return 0; } 2、中函数time(&t),精确度,秒级别 功能:取以秒为单位的,从1970年1月1日格林威治时间00:00:00算起的当前时间,并把它存在长整形变量t中,函数返回如前所述的时间秒值。 测试程序如下: #include "stdio.h " #include "time.h " #include "stdlib.h " main() { long start,end; time(&start); delay(50000); time(&end); printf( "end-start=%ld\n ",end-start); getch(); } 3. 最精确的计时:QueryPerformanceCounter来查询定时器的计数值,如果硬件里有定时器,它就会启动这个定时器,并且不断获取定时器的值,这样的定时器精度,就跟硬件时钟的晶振一样精确的。 #include #include #include void test() { int i = 0; int j = 0; double a = 0; while (i++ < 1000000) while (j++ < 1000000) { a = sqrt(2.0); } } int main(void) {

C语言日期时函数

asctime(将时间和日期以字符串格式表示) 相关函数:time,ctime,gmtime,localtime 表头文件:#include 定义函数:char * asctime(const struct tm * timeptr); 函数说明:asctime()将参数timeptr所指的tm结构中的信息转换成真实世界所使用的时间日期表示方法, 然后将结果以字符串形态返回。此函数已经由时区转换成当地时间, 字符串格式为:“Wed Jun 30 21:49:08 1993\n” 返回值:若再调用相关的时间日期函数,此字符串可能会被破坏。 此函数与ctime不同处在于传入的参数是不同的结构。 附加说明:返回一字符串表示目前当地的时间日期。 范例: 1#include 2main() { 3 time_t timep; 4 time (&timep); 5printf(“%s”,asctime(gmtime(&timep))); 6} 执行结果:Sat Oct 28 02:10:06 2000 ctime(将时间和日期以字符串格式表示) 相关函数:time,asctime,gmtime,localtime 表头文件:#include 定义函数:char *ctime(const time_t *timep); 函数说明:ctime()将参数timep所指的time_t结构中的信息转换成真实世界所使用的时间日期表示方法, 然后将结果以字符串形态返回。此函数已经由时区转换成当地时间, 字符串格式为“Wed Jun 30 21 :49 :08 1993\n”。 若再调用相关的时间日期函数,此字符串可能会被破坏。 返回值:返回一字符串表示目前当地的时间日期。 范例: 1#include 2main(){ 3 time_t timep; 4 time (&timep); 5printf(“%s”,ctime(&timep)); 6} 执行结果:Sat Oct 28 10 : 12 : 05 2000 gettimeofday(取得目前的时间) 相关函数:time,ctime,ftime,settimeofday 表头文件:#include #include 定义函数:int gettimeofday ( struct timeval * tv , struct timezone * tz ) 函数说明:gettimeofday()会把目前的时间有tv所指的结构返回,当地时区的信息则放到tz所指的结构中。

用C语言产生随机数

用c语言产生随机数 在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是void srand( int a)。 可能大家都知道C语言中的随机函数random,可是random函数并不是ANSI C标准,所以说,random函数不能在gcc,vc等编译器下编译通过。 rand()会返回一随机数值,围在0至RAND_MAX 间。返回0至RAND_MAX之间的随机数值,RAND_MAX定义在stdlib.h,(其值至少为32767),运算的结果是一个不定的数,要看你定义的变量类型,int整形的话就是32767。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。一般用for语句来设置种子的个数。具体见下面的例子。 一如何产生不可预见的随机序列呢 利用srand((unsigned int)(time(NULL))是一种方法,因为每一次运行程序的时间是不同的。

在C语言里所提供的随机数发生器的用法:现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。它们就是rand()和srand()函数。这二个函数的工作过程如下:1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值围从0~65535; 2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间) 3) 根据需要多次调用rand(),从而不间断地得到新的随机数; 4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。 下面是0~32767之间的随机数程序: #include #include #include //使用当前时钟做种子 void main( void ) {int i; srand( (unsigned)time( NULL ) ); //初始化随机数for( i = 0; i < 10;i++ ) //打印出10个随机数 printf( " %d\n", rand() ); } 根据上面的程序可以很容易得到0~1之间的随机数:

c语言函数段测试时间方法及比较

函数段测试时间方法及比较 作者:Peter 2011.4.7 一.用四种函数测量同一程序所需时间 1.函数段的测试有4中方法,分别是clock,times,gettimeofday,getrusage来实现的。 2.四种函数的精度如下: clock()函数的精确度是10毫秒(ms); times()函数的精确度是10毫秒(ms); gettimofday()函数的精确度是微秒(μs); getrusage()函数的精确度是纳秒(ns)。 =============================================================== 3.编写test5.c程序,测试1024*1024矩阵运行的时间,比较四种函数测量相同函数段所需的时间。 测试程序如下: =======================/*调用所需的头文件*/======================= #include #include #include #include #include =================/*定义宏变量:所需的4中测试方法*/================= #define TEST_BY_CLOCK (char)(0x00) //CLOCK测试 #define TEST_BY_TIMES (char)(0x01) //TIME测试 #define TEST_BY_GETTIMEOFDAY (char)(0x02) //GETTIMEOFDAY测试 #define TEST_BY_GETRUSAGE (char)(0x03) //GETRUSAGE测试 #define TEST_METHOD (TEST_BY_CLOCK) //选择需要的测试方法 ====================== /*矩阵格式定义*/======================== #define COORDINATION_X (int)(1024) #define COORDINATION_Y (int)(1024) static int g_Matrix[COORDINATION_X][COORDINATION_Y]; =============/*geTimeval类型及gettimeofday和getrusage计算方法*/==========

C语言字符串的输入和输出

C语言字符串的输入和输出 字符串的输入和输出 %c人为加入\0进行输入输出 %s直接输入输出 *输入输出字符串时字符数组应有足够的存储空间,指针变量作为输入项时,指针必须已经指向确切的、足够大的存储空间 %s的使用 scanf("%s",地址值) 地址值:字符数组名、字符指针、字符数组元素的地址 例:char str[15]; scanf("%s",str); abc123 1.不读入空格和回车,从空格处结束 2.输入字符串长度超过字符数组元素个数,不报错 3.当输入项为字符指针时,指针必须已指向确定的有足够空间的连续 存储单元 4.当为数组元素地址时,从此元素地址开始存放 2.printf("%s",地址值) 输出时遇到第一个'\0'为止 3.gets和puts函数 开头必须stdio.h #include"stdio.h"

1.gets(地址值) 地址值:字符数组名、字符指针、字符数组元素的地址 4.当为数组元素地址时,从此元素地址开始存放 5.printf("%s",地址值) 输出时遇到第一个'\0'为止 6.gets和puts函数 开头必须stdio.h #include"stdio.h" 1.gets(地址值) 地址值:字符数组名、字符指针、字符数组元素的地址 7.例: char str[10]; gets(str); 包括空格符 8. 2.puts(字符串起始地址) 遇第一个'\0'结束,自动加入换行符 9.字符串数组:数组中每个元素都是一个存放字符串的数组 可以将一个二维数组看作是字符串数组 10.char ca[3][5]={"A","BB","CCC"}; A\0 B B\0 C C C\0 字符型指针数组 char*pa[3]={"a","bb","ccc"}; pa[0]pa[1]pa[2] 可以重新赋值gets(pa[2]);

C语言中的22个数学函数

C语言的22个数学函数 在使用C语言数学函数时候,应该在该源文件中使用以下命令行: #include 或#include "math.h",这里的<>跟""分别表示:前者表示系统到存放C库函数头文件所在的目录寻找需要包含的文件,这是标准方式;后者表示系统先在拥护当前目录中寻找要包含的文件,若找不到,再按前者方式查找。为节省时间,在使用自己编写的文件时使用的是“”,自己编写的文件一般是在当前目录下。 22个数学函数中只有abs的数据类型是:”整型“,”int“。 log10、logE中的10与E是在log的左下角位置。其余求弧度函数需要看清楚是不是指数。排列方式如下:函数名:函数功能参数介绍,返回值,说明。函数原型。 1.abs: 求整型x的绝对值,返回计算结果。 int abs(int x); 2.acos:计算COS-1(x)的值,返回计算结果,x应在-1到1范围内。 doubleacos(double x); 3.asin: 计算SIN-1(x)的值,返回计算结果,x应在-1到1范围内。 doubleasin(double x); 4.atan: 计算TAN-1(x)的值,返回计算结果。double atan(double x); 5.atan2: 计算TAN-1/(x/y)的值,返回计算结果。 double atan2(double x,double y); 6.cos: 计算COS(x)的值,返回计算结果,x的单位为弧度。 double cos(double x); 7.cosh: 计算x的双曲余弦COSH(x)的值,返回计算结果。 double cosh(double x); 8.exp: 求e x的值,返回计算结果。 double exp(double x); 9.fabs: 求x的绝对值,返回计算结果。 duoblefabs(fouble x); 10.floor: 求出不大于x的最大整数,返回该整数的双精度实数。 double floor(double x); 11.fmod: 求整除x/y的余数,返回该余数的双精度。 doublefmod(double x,double y);

C语言中的时间处理函数

C语言中的时间处理函数收藏 来源:https://www.doczj.com/doc/6c7130508.html,/8892167_d.html C语言时间函数 [原创 2007-04-16 23:30:50] C语言的标准库函数包括一系列日期和时间处理函数,它们都在头文件中说明。下面列出了这些函数。在头文件中定 义了三种类型:time_t,struct tm和clock_t。在头文件 中说明的C语言时间函数 time_t time(time_t *timer); double difftime(time_t time1,time_t time2); struct tm *gmtime(const time_t *timer); struct tm *localtime(const time_t *timer); char *asctime(const struct tm *timeptr); char *ctime(const time_t *timer); size_t strftime(char *s,size_t maxsize,const char *format,const struct tm *timeptr); time_t mktime(struct tm *timeptr); clock_t clock(void); 下面是我从网上收集到的时间函数集 asctime(将时间和日 期以字符串格式表示)相关函数 time,ctime,gmtime,localtime 表头文件#i nclude 定义函数 char * asctime(const struct tm * timeptr); 函数说明 asctime()将参数timeptr所指的tm结构中的信息转换成真 实世界所使用的时间日期表示方法,然后将结果以字符串形 态返回。此函数已经由时区转换成当地时间,字符串格式为:"Wed Jun 30 21:49:08 1993\n" 返回值若再调用相关的 时间日期函数,此字符串可能会被破坏。此函数与ctime不 同处在于传入的参数是不同的结构。附加说明返回一字符 串表示目前当地的时间日期。范例#include

C语言函数手册(DOC)

一、字符测试函数 isupper()测试字符是否为大写英文字 ispunct()测试字符是否为标点符号或特殊符号isspace()测试字符是否为空格字符 isprint()测试字符是否为可打印字符 islower()测试字符是否为小写字母 isgraphis()测试字符是否为可打印字符 isdigit()测试字符是否为阿拉伯数字 iscntrl()测试字符是否为ASCII码的控制字符isascii()测试字符是否为ASCII码字符 isalpha()测试字符是否为英文字母 isalnum()测试字符是否为英文或数字 isxdigit()测试字符是否为16进制数字 二、字符串操作函数 strtok()字符串分割函数 strstr()字符串查找函数 strspn()字符查找函数 strrchr()定位字符串中最后出现的指定字符 strpbrk()定位字符串中第一个出现的指定字符strncpy()复制字符串 strncat()字符串连接函数 strncasecmp()字符串比较函数(忽略大小写) strlen()字符串长度计算函数 strdup()复制字符串 strcspn()查找字符串 strcpy()复制字符串 strcoll()字符串比较函数(按字符排列次序) strcmp()字符串比较函数(比较字符串) strchr()字符串查找函数(返回首次出现字符的位置) strcat()连接字符串 strcasecmp()字符串比较函数(忽略大小写比较字符串) rindex()字符串查找函数(返回最后一次出现的位置) index()字符串查找函数(返回首次出现的位置) toupper()字符串转换函数(小写转大写) tolower()字符串转换函数(大写转小写) toascii()将整数转换成合法的ASCII码字符 strtoul()将字符串转换成无符号长整型数

c语言字符函数和字符串函数及应用

ANSIC标准要求在使用字符串函数时要包含头文件”string.h”,在使用字符函数时要包含头文件”ctype.h”,有的C编译不遵循ANSI C标准的规定,而用其他的名称的头文件。请使用时查有关手册。 C语言中的字符与字 符串函数 (string.h,ctype.h) 函数名 函数和形参类型功能返回值包含文件 isalnum int isalnum(ch) int ch; 检查ch是否 是字母 (alpha)或数 字 (numeric). 是字母或数 字返回1;否 则返回0. ctype.h isalpha int isalpha(ch) int ch; 检查ch是否 是字母. 是,返回1; 否,返回0. ctype.h iscntrl int iscntrl(ch) int ch; 检查ch是否 控制字符(其 ASCII码在0 和0x1F之 间). 是,返回1; 否,返回0. ctype.h isgraph int isgraph(ch) int ch; 检查ch是否 可打印字符 (其ASCII码 在ox21和 ox7E之间), 不包括空格. 是,返回1; 否,返回0. ctype.h islower int islower(ch) int ch; 检查ch是否 小写字母 (a~z). 是,返回1; 否,返回0. ctype.h isprint int isprint(ch) int ch; 检查ch是否 可打印字符 (包括空格), 其ASCII码 在 ox20~ox7E 之间. 是,返回1; 否,返回0. ctype.h ispunct int ispunct(ch) int ch; 检查ch是否 标点字符(不 包括空格), 即除字母,数 字和空格以 是,返回1; 否,返回0. ctype.h

C语言随机函数

编程时有时需要随机输入一些数,这是调用随机函数可以完成此相命令. # include “stdio.h” # include “stdlib.h” # include “time.h” /*需引用的头文件*/ srand((unsigned)time(NULL)); /*随机种子*/ n=rand()%(Y-X+1)+X; /*n为X~Y之间的随机数*/ int rand(void) 函数int rand( void );返回的是一个界于0~32767(0x7FFF)之间的伪随机数,包括0和32767。C预先生成一组随机数,每次调用随机函数时从指针所指向的位置开始取值,因此使用rand()重复运行程序产生的随机数都是相同的,可以通过srand()函数来改变指针位置。 void srand( unsigned int seed ) 改变随机数表的指针位置(用seed变量控制)。一般配合time(NULL)使用,因为时间每时每刻都在改变,产生的seed值都不同。 一直被这个东西弄得模糊不清,终于又去整理了一下.弥补一些细节 主要是对rand()函数的使用//#include 原型int rand(void); 例如:void myrand(int imax) { assert(imax>0); int num = rand(); if(num<=imax) { return num; } else { return (num%imax); }

} 功能产生0到RAND_MAX之间的随机整数.至于RAND_MAX有多大,可以自己编程的时候输出.这是库里自带的宏定义. 像这样的一个函数,就产生了一个0到imax的随机整数.但是,当你多次运行你会发现,每一次产生的值都是一样的.并不是说没有随机,而是随机数发生器(程序产生的随机数是依靠时钟钟断来产生的.因此并不是真正意义上的随机.但对于我们来说,已经够用了)没有被重置.导致结果相同.那下面就看一下几种初始化随机数发生器的办法. srand()函数: 原型: void srand(unsigned seed) 功能: 产生随机数的起始发生数据,和rand函数配合使用 头文件: stdlib.h time.h 例: #include #include #include int main(void) { int i; time_t t;

C语言函数库详解(收藏版)

c语言函数库 目录 第一章(C标准库) (4) 1. :诊断 (4) 2. :字符类别测试 (5) 3. :错误处理 (5) 4. :整型常量 (6) 5. :地域环境 (6) 6. :数学函数 (7) 7. :非局部跳转 (8) 8. :信号 (9) 9. :可变参数表 (11) 10. :公共定义 (11) 11. :输入输出 (12) 12. :实用函数 (13) 13. :日期与时间函数 (13) 第二章(IO函数) (14) clearerr:复位错误标志函数 (15) feof:检测文件结束符函数 (16) ferror:检测流上的错误函数 (17) fflush:清除文件缓冲区函数 (18) fgetc:从流中读取字符函数 (19) fgetpos:取得当前文件的句柄函数 (20) fgets:从流中读取字符串函数 (21) fopen、fclose:文件的打开与关闭函数 (22) fprintf:格式化输出函数 (23) fputc:向流中输出字符函数 (25) fputs:向流中输出字符串函数 (25) fread:从流中读取字符串函数 (26) freopen:替换文件中数据流函数 (27) fscanf:格式化输入函数 (28) fseek:文件指针定位函数 (28) fsetpos:定位流上的文件指针函数 (30) ftell:返回当前文件指针位置函数 (31) fwrite:向文件写入数据函数 (31) getc:从流中读取字符函数 (32) getchar:从标准输入文件中读取字符函数 (33) gets:从标准输入文件中读取字符串函数 (34) perror:打印系统错误信息函数 (34) printf:产生格式化输出的函数 (35) putc:向指定流中输出字符函数 (36) putchar:向标准输出文件上输出字符 (37)

C语言生成随机函数

程序有一个参数,表示生成的密码的长度 运行的时候要加上,比如./password 8 我写的很简单,参数没做检查,你应该自己去完善一下。 #include #include #include void generate(int len,char* buffer) { /*产生密码用的字符串*/ static const char string[]= "0123456789abcdefghiljklnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; int i = 0; for(; i < len; i++) { buffer[i] = string[rand()%strlen(string)]; /*产生随机数*/ } } int main(int argc, char* argv[]) { int len = atoi(argv[1]); /*指定生成的密码长度*/ srand(time(0)); /*设定随机数种子*/ char *buffer = (char*)malloc(len + 1); /*分配内存*/ generate(len,buffer); /*生成密码*/ puts(buffer); /*输出到屏幕*/ FILE* fp = fopen("pass","w"); /*打开输出文件*/ if(fp == NULL) return -1; fwrite(buffer, sizeof(char), len, fp); /*写文件*/ fclose(fp); /*关闭文件*/ free(buffer); /*释放动态分配的内存*/ return 0; /*程序结束*/ } 自己可以写一个函数。 IT生活系列群: 50337593 IT-live(软件开发) 计算机软件技术群,技术是相通的,大家取长补短,共同进步吧!--软件不仅仅是一种思想。他是一门艺术 30633141 IT-live(网站建设)

C语言中日期时间函数大全

C语言日期时间函数大全 头文件:#include 1、asctime 定义函数:char *asctime(const struct tm * timeptr); 函数说明:asctime()将参数timeptr 所指的tm 结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回。此函数已经由时区转换成当地时间,字符串格式为:"Wed Jun 30 21:49:08 1993\n" 返回值:若再调用相关的时间日期函数,此字符串可能会被破坏。此函数与ctime 不同处在于传入的参数是不同的结构。 附加说明:返回一字符串表示目前当地的时间日期. 范例 #include main(){ time_t timep; time (&timep); printf("%s", asctime(gmtime(&timep))); }

执行 Sat Oct 28 02:10:06 2000 2、ctime 定义函数:char *ctime(const time_t *timep); 函数说明:ctime()将参数timep 所指的time_t 结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回。此函数已经由时区转换成当地时间,字符串格式为"Wed Jun 30 21 :49 :08 1993\n"。 注意:若再调用相关的时间日期函数,此字符串可能会被破坏。 返回值:返回一字符串表示目前当地的时间日期。 范例 #include main(){ time_t timep; time (&timep); printf("%s", ctime(&timep)); } 执行 Sat Oct 28 10 : 12 : 05 2000 3、gettimeofday 头文件:#include #include 定义函数:int gettimeofday (struct timeval * tv, struct timezone * tz); 函数说明:gettimeofday()会把目前的时间有tv 所指的结构返回,当地时区的信息则放到tz 所指的结构中。

C语言函数大全

功能: 异常终止一个进程 用法: void abort(void) 函数名: abs 功能: 求整数的绝对值 用法: int abs(int i) 函数名: absread, abswirte 功能: 绝对磁盘扇区读、写数据 用法: int absread(int drive, int nsects, int sectno, void *buffer) int abswrite(int drive, int nsects, in tsectno, void *buffer 函数名: access 功能: 确定文件的访问权限 用法: int access(const char *filename, int amode) 函数名: acos 功能:反余弦函数 用法: double acos(double x) 函数名: allocmem 功能: 分配DOS存储段 用法:int allocmem(unsigned size, unsigned *seg) 函数名: arc 功能: 画一弧线 用法:void far arc(int x, int y, int stangle, int endangle, int radius)函数名: asctime 功能: 转换日期和时间为ASCII码 用法:char *asctime(const struct tm *tblock) 函数名: asin 功能:反正弦函数 用法: double asin(double x) 函数名: assert 功能: 测试一个条件并可能使程序终止 用法:void assert(int test) 函数名: atan 功能: 反正切函数 用法: double atan(double x)

C语言常用函数手册

1.分类函数,所在函数库为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') 2.数学函数,所在函数库为math.h、stdlib.h、string.h、float.h int abs(int i) 返回整型参数i的绝对值 double cabs(struct complex znum) 返回复数znum的绝对值 double fabs(double x) 返回双精度参数x的绝对值 long labs(long n) 返回长整型参数n的绝对值 double exp(double x) 返回指数函数ex的值 double frexp(double value,int *eptr) 返回value=x*2n中x的值,n存贮在eptr中double ldexp(double value,int exp); 返回value*2exp的值 double log(double x) 返回logex的值 double log10(double x) 返回log10x的值 double pow(double x,double y) 返回xy的值 double pow10(int p) 返回10p的值 double sqrt(double x) 返回+√x的值 double acos(double x) 返回x的反余弦cos-1(x)值,x为弧度 double asin(double x) 返回x的反正弦sin-1(x)值,x为弧度 double atan(double x) 返回x的反正切tan-1(x)值,x为弧度 double atan2(double y,double x) 返回y/x的反正切tan-1(x)值,y的x为弧度double cos(double x) 返回x的余弦cos(x)值,x为弧度 double sin(double x) 返回x的正弦sin(x)值,x为弧度 double tan(double x) 返回x的正切tan(x)值,x为弧度 double cosh(double x) 返回x的双曲余弦cosh(x)值,x为弧度 double sinh(double x) 返回x的双曲正弦sinh(x)值,x为弧度

C语言字符串操作总结大全(超详细)

C语言字符串操作总结大全(超详细) 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度字符串 strlen(p) 取字符串长度 strcmp(p, p1) 比较字符串 strcasecmp忽略大小写比较字符串 strncmp(p, p1, n) 比较指定长度字符串 strchr(p, c) 在字符串中查找指定字符 strrchr(p, c) 在字符串中反向查找 strstr(p, p1) 查找字符串 strpbrk(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找该集合的任一元素strspn(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找不属于该集合的任一元素的偏移 strcspn(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找属于该集合的任一元素的偏移 * 具有指定长度的字符串处理函数在已处理的字符串之后填补零结尾符 2)字符串到数值类型的转换 strtod(p, ppend) 从字符串p 中转换double 类型数值,并将后续的字符串指针存储到ppend 指向的char* 类型存储。 strtol(p, ppend, base) 从字符串p 中转换long 类型整型数值,base 显式设置转换的整型进制,设置为0 以根据特定格式判断所用进制,0x, 0X 前缀以解释为十六进制格式整型,0 前缀以解释为八进制格式整型 atoi(p) 字符串转换到int 整型 atof(p) 字符串转换到double 符点数 atol(p) 字符串转换到long 整型 3)字符检查 isalpha() 检查是否为字母字符 isupper() 检查是否为大写字母字符 islower() 检查是否为小写字母字符 isdigit() 检查是否为数字 isxdigit() 检查是否为十六进制数字表示的有效字符 isspace() 检查是否为空格类型字符 iscntrl() 检查是否为控制字符 ispunct() 检查是否为标点符号 isalnum() 检查是否为字母和数字 isprint() 检查是否是可打印字符 isgraph() 检查是否是图形字符,等效于isalnum() | ispunct()

c语言中常用的函数和头文件

头文件ctype.h 函数列表<> 函数类别函数用途详细说明 字符测试是否字母和数字isalnum 是否字母isalpha 是否控制字符iscntrl 是否数字isdigit 是否可显示字符(除空格外)isgraph 是否可显示字符(包括空格)isprint 是否既不是空格,又不是字母和数字的可显示字符ispunct 是否空格isspace 是否大写字母isupper 是否16进制数字(0-9,A-F)字符isxdigit 字符大小写转换函数转换为大写字母toupper 转换为小写字母tolower 地区化 本类别的函数用于处理不同国家的语言差异。 头文件local.h 函数列表 函数类别函数用途详细说明 地区控制地区设置setlocale 数字格式约定查询国家的货币、日期、时间等的格式转换localeconv 数学函数 本分类给出了各种数学计算函数,必须提醒的是ANSI C标准中的数据格式并不符合IEEE754标准,一些C语言编译器却遵循IEEE754(例如frinklin C51) 头文件math.h 函数列表 函数类别函数用途详细说明 错误条件处理定义域错误(函数的输入参数值不在规定的范围内) 值域错误(函数的返回值不在规定的范围内) 三角函数反余弦acos 反正弦asin 反正切atan 反正切2 atan2 余弦cos

正弦sin 正切tan 双曲函数双曲余弦cosh 双曲正弦sinh 双曲正切tanh 指数和对数指数函数exp 指数分解函数frexp 乘积指数函数fdexp 自然对数log 以10为底的对数log10 浮点数分解函数modf 幂函数幂函数pow 平方根函数sqrt 整数截断,绝对值和求余数函数求下限接近整数ceil 绝对值fabs 求上限接近整数floor 求余数fmod 本分类函数用于实现在不同底函数之间直接跳转代码。头文件setjmp.h io.h 函数列表 函数类别函数用途详细说明 保存调用环境setjmp 恢复调用环境longjmp 信号处理 该分类函数用于处理那些在程序执行过程中发生例外的情况。 头文件signal.h 函数列表 函数类别函数用途详细说明 指定信号处理函数signal 发送信号raise 可变参数处理 本类函数用于实现诸如printf,scanf等参数数量可变底函数。 头文件stdarg.h 函数列表

C语言编写S函数方法

S函数(system function)是模块的核心,是完成功能实现的关键。S函数的编写可以使用多种程序语言,其中M语言是最常用的,同时也是最简单的。在运用M语言进行s函数编写的时候,可以调用MATLAB提供的函数,简化了开发过程。但是如果要与其他进程通讯或驱动外部硬件接口,则要调用API函数,这样就需要用C语言来开发S函数。较M语言的开发,C语言开发S函数更具有灵活性,但是相对复杂一些。 C语言写S函数,顾名思义,运用C语言语法,依照S函数格式要求,最后在MATLAB中MEX命令编译,编译成功既得函数。 S函数格式可简单看成:初始化、采样时间设定、系统输出、结束四个部分。对应的函数分别为mdlInitializeSizes()、mdlInitializeSampleTimes()、mdlOutputs()、mdlTerminate()。这四个函数是一个S函数必不可少的,缺少任何一个在编译的时候都无法通过,输出信息会提示哪个函数没有写。 一个最基本的C语言S函数模版如下: #define S_FUNCTION_NAME name #define S_FUNCTION_LEVEL 2 #include “” Static void mdlInitializeSizes(SimStruct *S){} Static void mdlInitializeSampleTimes(SimStruct *S){} Static void mdlOutputs(SimStruct *S,int_T tid){} Static void mdlTerminate(SimStruct *S){} #ifdef MATLAB_MEX_FILE #include “” #else #include “” #endif S函数的运行依托于Simulink,Simulink的运行是采用循环方式,计算各采样时间点的系统状态得到的,由此可理解S函数,在初始化之后,S函数也通过循环完成输出状态计算。 结合上述格式,首先自定义S函数名称,然后定义S函数级别,这里写2,1级是老版本Simulink使用的,现已经不是用,之所以保留1级是为了兼容原有的老程序,现在写的S函数都是2级的。接下来将需要的头文件包含进来,这里必须包含文件,这里的SimStruc是Simulink提供的数据结构,S函数中的输入输出等信息都包含在这个结构体中,同时,在编写S函数的时候也要把使用到的C语言库中的头文件包含进来,所有的C语言库文件在这里都可以使用。接下来即可按照格式顺序编写代码。最后要注意,如果用于仿真则添加文件,如果用于RTW 代码生成,则添加头文件。这里的RTW代码生成是指非内嵌的S函数,如果要做一个内嵌的S函数则需要在S函数中添加mdlRTW()函数,并额外编写TLC文件。其中,TLC文件用于优化的C代码生成,mdlRTW()函数则把模块参数传递到生成的代码当中。具体TLC文件的编写方法这里不再赘述。 除了上述必需的函数外,系统提供了其他可选用的函数,功能各异,例如mdlStart()等。 只要理解了Simulink运行方式就可以理解文件的开发过程了,其中,系统函数和特定的变量类型都可以在SimStruct数据结构中找到。至此,基本的S函数都可以编写了。

相关主题
文本预览
相关文档 最新文档