C语言各种函数
#include<stdio.h> #include <conio.h>/*控制台 就是(console,控制台)io就是输入输出,连起来就是用来声明控制台输入输出所需函数的头文件如果你要用到像 getch() cprintf() cputs() kbhit()之类的函数,那就需要这个头文件了
#include <stdio.h> #include<fstream> #include <assert.h> #include <stdlib.h> int main() { FILE*fp; fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件 assert(fp); //所以这里不会出错 fclose(fp); fp = fopen("noexitfile.txt", "r");//以只读的方式打开一个文件,如果不存在就打开文件失败 assert(fp); //所以这里出错 fclose(fp); //程序永远都执行不到这里来 return 0; }http://baike.baidu.com/view/2058283.htm
下面的代码,如果没有键盘输入程序一直输出Hello World,直到用户按Esc结束 */ #include<stdlib.h> //using namespace std; int main(void) { int i; for(i=0;i<20;i++) cprintf("%d\r\n",i); cprintf("\r\nPress any key to clear screen"); getch(); system("cls"); cprintf("\rThe screen has been cleared!"); getch(); system("cls"); while(!kbhit()) { cprintf("Hello World\n"); if(kbhit()) { char ch = getch(); if( '2'== ch ) break; printf("你当我是浮夸吧,k歌之王\n"); } } return 0; }
stdlib.h
stdlib 头文件里包含了C语言的一些函数
该文件包含了的C语言标准库函数的定义
stdlib.h里面定义了五种类型、一些宏和通用工具函数。类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t;
宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX和MB_CUR_MAX等等
;常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、 srand()、exit()等等。
具体的内容你自己可以打开编译器的include目录里面的stdlib.h头文件看看。calloc是一个C语言函数
函数名: calloc
void *calloc(unsigned n,unsigned size);
功 能: 在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。
跟malloc的区别:
calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。
用 法: void *calloc(unsigned n,unsigned size);
头文件:stdlib.h或malloc.h
相关函数:malloc、realloc、free
标准库<cstdlib>(被包含于<iostream>中)提供两个帮助生成伪随机数的函数:
函数一: rand(void); 函数一:int rand(void);
从 srand (seed)中指定的 seed 开始,返回一个[seed, RAND_MAX(0x7fff))间的随机整数.
函数二: seed); 函数二:void srand(unsigned seed);
参数 seed 是 rand()的种子,用来初始化 rand()的起始值.
可以认为 rand()在每次被调用的时候,它会查看: 1)如果用户在此之前调用过 srand(seed), seed 指定了一个值, 给 那么它会自动调用 srand(seed) 一次来初始化它的起始值. 2) 如果用户在此之前没有调用过 srand(seed),
它会自动调用 srand(1)一次. 根据上面的第一点我们可以得出:
1) 如果希望 rand()在每次程序运行时产生的值都不一样,必须给 srand(seed)中的 seed 一个 变值,
这个变值必须在每次程序运行时都不一样(比如到目前为止流逝的时间).
2) 否则,如果给 seed 指定的是一个定值,那么每次程序运行时 rand()产生的值都会一样,
虽 然这个值会是[seed, RAND_MAX(0x7fff))之间的一个随机取得的值.
3) 如果在调用 rand()之前没有调用过 srand(seed),
效果将和调用了 srand(1)再调用 rand() 一样(1 也是一个定值).
举几个例子,假设我们要取得 0~6 之间的随机整数(不含 6 本身):
例一,不指定 seed: for(int i=0;i<10;i++){ ran_num=rand() % 6; cout<<ran_num<<" ";
} 每次运行都将输出:5 5 4 4 5 4 0 0 4 2 例二,指定 seed 为定值 1: srand(1); for(int i=0;i<10;i++){ ran_num=rand() % 6; cout<<ran_num<<" "; } 每次运行都将输出:5 5 4 4 5 4 0 0 4 2 跟例子一的结果完全一样. 例三,指定 seed 为定值 6: srand(6); for(int i=0;i<10;i++){ ran_num=rand() % 6; cout<<ran_num<<" "; }
每次运行都将输出:4 1 5 1 4 3 4 4 2 2 随机值也是在[0,6)之间,随得的值跟 srand(1)不同,但是每次运行的结果都相同. 例四,指定 seed 为当前系统流逝了的时间(单位为秒):time_t time(0): #include <ctime> //… srand((unsigned)time(0)); for(int i=0;i<10;i++){ ran_num=rand() % 6; cout<<ran_num<<" "; } 第一次运行时输出:0 1 5 4 5 0 2 3 4 2 第二次:3 2 3 0 3 5 5 2 2 3 总之,每次运行结果将不一样,因为每次启动程序的时刻都不同(间隔须大于 1 秒?,见下). 关于 time_t time(0): time_t 被定义为长整型,它返回从 1970 年 1 月 1 日零时零分零秒到目前为止所经过的时间,单 位为秒.比如假设输出: cout<<time(0); 值约为 1169174701,约等于 37(年)乘 365(天)乘 24(小时)乘 3600(秒)(月日没算). 另外,关于 ran_num = rand() % 6, 将 rand()的返回值与 6 求模是必须的,这样才能确保目的随机数落在[0,6)之间,否则 rand() 的返回值本身可能是很巨大的. 一个通用的公式是: 要取得[a,b)之间的随机整数,使用(rand() % (b-a))+ a (结果值将含 a 不含 b). 在 a 为 0 的情况下,简写为 rand() % b. 最后,关于伪随机浮点数: 用 rand() / double(RAND_MAX)可以取得 0~1 之间的浮点数(注意,不同于整型时候的公式, 是除以,不是求模),举例: double ran_numf=0.0; srand((unsigned)time(0)); for(int i=0;i<10;i++){ ran_numf = rand() / (double)(RAND_MAX); cout<<ran_numf<<" "; } 运行结果为:0.716636,0.457725,…等 10 个 0~1 之间的浮点数,每次结果都不同. 如果想取更大范围的随机浮点数,比如 1~10,可以将 rand() /(double)(RAND_MAX) 改为 rand() /(double)(RAND_MAX/10)运行结果为:7.19362,6.45775,…等 10 个 1~10 之间的浮点数,每次结果都不同. 至于 100,1000 的情况,如此类推.
除以上所说的之外,补充一点就是srand这个函数一定要放在循环外面或者是循环调用的外面,否则的话得到的是相同的数字。
先定义int ran_num,再种子srand((unsigned)time(0));,再ran_num=rand()% 6,否则不成功。
time_t(0)千万不能用啊。也是跟没用种子一样