linux下的c语言系统函数调用

目录

4.linux下的系统函数的使用 c语言

4.1数学函数的使用

1pow函数

2.exp函数

3.log函数

4.rand()随机数函数

4.2字符函数的使用

4.3系统时间与日期函数的使用

系统时间

时间间隔

4.4环境控制函数

 

4.linux下的系统函数的使用 c语言

4.1数学函数的使用

pow(x,y)  //x的y次方 
exp(x)      //e的x次方
log(x)      //lnx
log10(x)  //lg(x)   
以上返回值参数全double

1pow函数

#include<stdio.h>
#include<math.h>
int main(){
	double answer,x,y;
	scanf("%lf %lf",&x,&y);
	answer=pow(x,y);
	printf("%lf的%lf次方等于%lf\n",x,y,answer);
	return 0;
}

《linux下的c语言系统函数调用》

 

2.exp函数

#include<stdio.h>
#include<math.h>
int main(){
	double answer,x;
	scanf("%lf",&x);
	answer=exp(x);
	printf("e的%lf次方等于%lf\n",x,answer);
	return 0;
}

《linux下的c语言系统函数调用》

 

3.log函数

#include<stdio.h>
#include<math.h>
int main(){
	double answer1,answer2,x,y;
	scanf("%lf %lf",&x,&y);
	answer1=log(x);//2.718281828
	answer2=log10(y);//10
	printf("log(%lf)=%lf\n",x,answer1);
	printf("log10(%lf)=%lf\n",y,answer2);
	return 0;
}

《linux下的c语言系统函数调用》

 

sqrt(x)  求平方根   

函数都在math.h 里编译时加上-lm    c++编译则不用

 

4.rand()随机数函数

先设置随机数种子 否则每次产生的随机数一样
srand(time(0));

头文件 #include<stdlib.h>

int rand(void); //0~2147483674(0~RAND_MAX) 之间的随机数

模板1:
rand()/(RAND_MAX+1.0)                 产生:[0,1)
int(10.0×rand()/(RAND_MAX+1.0))     产生[0,10)
1+int(10.0×rand()/(RAND_MAX+1.0))     产生[1,10]

模板2:
rand()%(N+1)    产生[0,N]
M+rand()%(N+1)  产生[M,M+N]

 

4.1.产生10个1到10的随机数

#include<stdio.h>
#include "stdlib.h"
int main(){
	int i,j;
	srand((int)time(0));
	for(i=0;i<10;i++){
		j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
		printf(" %d ",j);
	}
	printf("\n");
	return 0;
}

《linux下的c语言系统函数调用》

 

4.2产生20个[100,1000]的随机数

#include <stdlib.h>
#include "stdio.h" 
int main(){
	int i,j; 
	srand((int)time(0)); 
	for(i=0;i<20;i++){
		j=100+rand()%901;
		printf(" %d ",j);
		if(i==9) printf("\n");
	}
	printf("\n");
}

《linux下的c语言系统函数调用》

 

4.2字符函数的使用

c语言字符函数

函数名功能
isalnum是否为英文字母或数字
isalpha是否为英文字母
isascii是否为ascii码字符
isdigit是否为阿拉伯数字
islower是否为小写英文字母
isprint是否为可打印字符
isspace是否为空格
ispunct是否为标点符号或特殊符号
isupper是否为大写英文字母
isxdigit是否为16进制数字
头文件#include<ctype.h>
#include<stdio.h>
#include <ctype.h>
int main(){
	char c;
	while(scanf("%c",&c)==1){
		if(isalnum(c)) printf("%c是英文字母或数字\n",c);
		if(isalpha(c)) printf("%c是英文字母\n",c);
		if(isascii(c)) printf("%c是ascii码字符\n",c);
		if(iscntrl(c)) printf("%c是ascii码控制字符\n",c);
		if(isdigit(c)) printf("%c是数字\n",c);
		if(islower(c)) printf("%c是小写字母\n",c);
		if(isupper(c)) printf("%c是大写字母\n",c);
		if(isprint(c)) printf("%c是可打印字符\n",c);
		if(isspace(c)) printf("%c是空格\n",c);
		if(isxdigit(c)) printf("%c是16进制数字\n",c);
		getchar();
	}
	return 0;
}

 

《linux下的c语言系统函数调用》

《linux下的c语言系统函数调用》

 

4.3系统时间与日期函数的使用

系统时间

系统时间与日期函数

函数名功能
asctime将时间和日期以字符串格式表示
ctime将时间和日期以字符串格式表示
gettimeofday取得当前时间
gmtime把时间和日期转换为格林尼治(GMT)时间(世界时)
localtime取得目前当地的时间和日期,并转换为现在的时间日期表示方法
mktime将时间结构数据转换成经过的秒数
settimeofday设置当前时间
time取得系统当前的时间
//系统结构体
struct tm{
	int tm_sec;  //秒
	int tm_min;  //分
	int tm_hour; //时
	int tm_mday;  //当前月日数
	int tm_mon;  //月 0~11
	int tm_year;  //1900至今的年数  1900+p->tm_year得到今年年份
	int tm_wday;  //一星期的日数 0~6
	int tm_yday;  //一年内的天数 0~365
	int tm_isdst;  //夏时制时间	
};

头文件#include<time.h>
time_t time(time_t *t);  
取得当前时间 其实是返回1970年1月1日0:0:0至今的秒数 
返回值会直接存到t指向的内存   

头文件#include<time.h>
struct tm* gmtime(const time_t* timep);
将time_t里的秒数转换成现在的时间格式(格林尼治)  返回结构体struct_t

头文件#include<time.h>
char* asctime(const struct tm * timeptr);
将结构体struct_tm里的时间转换成现在使用的时间日期表示法,格式为”Wed Jun 30 16:13:00 2018\n”

头文件#include<time.h>
struct tm *localtime(const time_t *timep);
将time_t里的时间信息转换成现在使用的时间日期表示法,返回强悍的struct tm结构体

eg1:time取得当前时间,gmtime转换成格林尼治时间,字符串形式输出(直接asctime函数转)。
         自己转换,成“xxxx年 x月 xx日 Tue 15:52:00″形式显示系统时间
 

#include<time.h>
int main(){
	time_t timep;//时间结构体变量
	char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; 
	struct tm *p;
	time(&timep);//获取当前时间
	printf("%s",asctime(gmtime(&timep)));
	p=localtime(&timep);//获取当地时间 并按现在的时间日期来表示
	printf("%d年 %d月 %d日\n",(1900+p->tm_year),(1+p->tm_mon),p->tm_mday);
	printf("%s %d:%d:%d\n",wday[p->tm_wday],p->tm_hour,p->tm_min,p->tm_sec);
	return 0;
}

《linux下的c语言系统函数调用》

eg2:c语言写钟表

#include<stdio.h>
#include<time.h>
#include <unistd.h>
main(){
	time_t timep;//时间结构体变量
	struct tm *p;
	while(1){
		time(&timep);//获取当前时间
		p=localtime(&timep);//获取当地时间 并按现在的时间日期来表示
		printf("%d年%d月%d日 %d:%d:%02d\n",1900+p->tm_year,p->tm_mon+1,p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec);
		sleep(1);
	}
 	printf("\n时间到!\n\a"); // \a是让系统发出声音的一种表达方式
 }

《linux下的c语言系统函数调用》

 

时间间隔

struct timeval{
       long tv_sec; //秒
       long tv_usec;//微秒
};

struct timezone{
       int tz_minuteswest; //和格林尼治时间差了多少分钟
       int tz_dsttime; //日光节约时间的状态
};

gettimeofday函数说明
头文件:#include<sys/time.h>     #include<unistd.h>
int gettimeofday(struct timeval * tv,struct timezone * tz)
把当前时间分s与us放到tv中返回  当地时区信息放到tz中返回

做某事的时间模板
gettimeofday(&tv1,&tz);
/*do something*/
gettimeofday(&tv2,&tz);
t=tv2.tv_sec-tv1.tv_sec+(tv2.tv_usec-tv1.tv_usec)*pow(10,-6);//s+us*10^-6

eg1.

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
int main(){
	struct timeval tv1,tv2;
	struct timezone tz;
	gettimeofday(&tv1,&tz);
	printf("1970距离今天tv_sec= %d 秒\n",tv1.tv_sec);
	printf("零头有tv_usec= %d 微秒\n",tv1.tv_usec);
	gettimeofday(&tv2,&tz);
	printf("第7行到第10行程序耗时tv2_usec-tv1_usec= %d 微秒\n",tv2.tv_usec-tv1.tv_usec);//程序一定在ms内完成
	//printf("%d\n",tv2.tv_sec-tv1.tv_sec);//绝对在ms级别 所以输出0
	return 0;
}

《linux下的c语言系统函数调用》

 

exp2:大例

#include<stdio.h>
#include<stdlib.h>
#include<sys/time.h>
#include<unistd.h>
int main()
{
	long int begin,sec,stop;
	struct timeval tv1, tv2;
	struct timezone tz;
	char tmp;
	begin=0;
	stop=0;
	sec=0;
	system("clear");
	printf("计时器程序(单位s)\n");
	printf("输入b(begin)计时器开始计时\n");
	printf("输入w(watch)查看已经累计时间\n");
	printf("输入r(rest)重新开始计时\n");
	printf("输入s(stop)暂停计时器\n");
	printf("输入e(end)结束计时器\n");
	while(1)
	{
		scanf("%c",&tmp);
		if(tmp=='b')
		{
			if(begin==1&&stop==0)
				printf("计时器已经启动!\n");
			if(begin==0&&stop==0)
			{
				printf("计时器启动\n");
				gettimeofday(&tv1,&tz);
				sec=0;
				begin=1;
			}
			if(stop==1)
			{
				gettimeofday(&tv1,&tz);
				stop=0;
				printf("暂停结束!\n");
			}
		}
		if(tmp=='w'){
			if(stop==0){
				gettimeofday(&tv2,&tz);
				printf("已经计时%ld 秒\n",sec+tv2.tv_sec-tv1.tv_sec);
			}
			if(stop==1)
				printf("已经计时%ld 秒\n",sec);
		}
		if(tmp=='s'){
			if(stop==1){
				printf("计时已经暂停!\n");
			}
			if(stop==0){
				gettimeofday(&tv2,&tz);
				sec=sec+tv2.tv_sec-tv1.tv_sec;
				printf("计时暂停,已经计时%ld 秒\n",sec);
				stop=1;
			}
		}
		if(tmp=='r'){
			gettimeofday(&tv2,&tz); 
			printf("已经计时%ld 秒\n",sec+tv2.tv_sec-tv1.tv_sec);
			printf("计时器在5 秒后被重置!\n");
			sleep(5);
			begin=0;
			sec=0;
			stop=0;
			system("clear");
			printf("计时器程序(单位s)\n");
			printf("输入b(begin)计时器开始计时\n");
			printf("输入w(watch)查看已经累计时间\n");
			printf("输入r(rest)重新开始计时\n");
			printf("输入s(stop)暂停计时器\n");
			printf("输入e(end)结束计时器\n");
		}
		if(tmp=='e') break;
	}
	return 0;
}

 

《linux下的c语言系统函数调用》

 

4.4环境控制函数

常用环境控制函数

函数名功能
getenv取得环境变量的内容
putenv/setenv改变/增加环境变量
unsetenv取消已经改变的环境变量

getenv函数:
头文件:#include<stdlib.h>
char* getenv(const char *name);  //失败返回null
根据环境变量名name,取得该系统环境变量的值      环境变量格式key=value    

eg1.获取当前登录用户

当前登录用户环境变量key为USER  (只能大写,不能小写)

#include<stdio.h>
#include<stdlib.h>
int main(){
	char *p;
	if((p=getenv("USER")))
		printf("USER=%s\n", p);
	return 0;
}

《linux下的c语言系统函数调用》

 

setenv函数:
头文件:#include<stdlib.h>
int setenv(const char *key,const char *value,int overwrite);
改变或者增加环境变量     overwrite:1:改为value新值       0:该环境变量已有内容时,参数value被忽略(也即本次不改值)    

 

eg2:修改USER的值

#include<stdio.h>
#include<stdlib.h>
int main(){
	char *p;
	if(p=(getenv("USER"))){
		printf("USER =%s\n",p);
	}
	setenv("USER","test",1);
	printf("USER=%s\n",getenv("USER"));
	unsetenv("USER");
	printf("USER=%s\n",getenv("USER"));
	setenv("USER","test",0);//USER无value时也会改
	printf("USER=%s\n",getenv("USER"));
	setenv("USER","test2",0);//USER有value时不会改 忽略test2 下面仍然输出test
	printf("USER=%s\n",getenv("USER"));
	return 1;	
}

《linux下的c语言系统函数调用》

 

 

exp3:输出系统所有的环境变量

linuxC有一个全局变量 environ 在unistd.h里

#include<stdio.h>
int main(){
	extern char **environ;//environ不能取别的名字 是系统全局变量
	int i;
	for(i=0;environ[i]!=NULL;i++){
		printf("%s\n",environ[i]);
	}
	return 0;
}

或者不用extern声明 直接#include<unistd.h>

#include<stdio.h>
#include<unistd.h>
int main(){
	int i;
	for(i=0;environ[i]!=NULL;i++){
		printf("%s\n",environ[i]);
	}
	return 0;
}

《linux下的c语言系统函数调用》

 

4.5内存分配函数

常用内存分配函数

函数名功能
calloc/malloc配置内存空间
getpagesize取得操作系统中内存分页大小
mmap建立内存映射
munmap解除内存映射
free释放原先配置的内存

calloc函数
头文件#include<stdlib.h>
void *calloc(size_t nmemb,size_t size); //成功返回指针,失败返回NULL
用来分配nmemb*size的内存块。
nmemb为内存块的大小
size为内存块的数量
calloc()配置内存时会将内存内容初始化为0

getpagesize函数
头文件:#include<unistd.h>
size_t getpagesize(void);
取得内存分页大小
取得的为系统分页大小,不一定和硬件分页大小相同

malloc函数
头文件:#include<stdlib.h>
void *malloc(size_t size);//成功返回指针 失败返回NULL
配置内存空间,大小由指定的size决定

exp1.录入结构体

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<ctype.h>
struct co
{
	int index;
	char name[8];
	char MTel[12];
	char Tel[12];
};
int x;
int main(){
	freopen("input.txt","r",stdin);
	struct co *p;
	char ch;
	printf("do you want to add a user?Y/N\n");
	ch=getchar();
	if(ch=='y'||ch=='Y'){
		p=(struct co *)malloc(sizeof(struct co));
		p->index=++x;
		printf("User name:");
		scanf("%s", p->name);
		printf("MoveTel:");
		scanf("%s",p->MTel);
		printf("Tel:");
		scanf("%s",p->Tel);
		printf("intex:%d\nname:%s\nMoveTel:%s\nHomeTel:%s\n",p->index,p->name,p->MTel,p->Tel);
	}
	printf("page size=%d\n", getpagesize());/*取得内存分页大小*/
	return 0;
}

input.txt:

Y
tomcat
17812345678
110

《linux下的c语言系统函数调用》

 

mmap函数
头文件:#include<unistd.h>   #inlucde<sys/mman.h>
void *mmap(void *start,size_t length,int prot, int flags,int fd,off_t offsize);
参数start指向对应的内存起始地址,通常设置为NULL

参数length代表将文件中多大的部分对应到内存

参数prot:映射区域的保护方式。可以为以下几种方式的组合:
PROT_EXEC 映射区域可被执行
PROT_READ 映射区域可被读取
PROT_WRITE 映射区域可被写入
PROT_NONE 映射区域不能存取

参数flags:影响映射区域的各种特性。在调用mmap()时必须要指定MAP_SHARED 或MAP_PRIVATE。
MAP_FIXED 如果参数start所指的地址无法成功建立映射时,则放弃映射,不对地址做修正。通常不鼓励用此旗标。
MAP_SHARED对映射区域的写入数据会复制回文件内,而且允许其他映射该文件的进程共享。
MAP_PRIVATE 对映射区域的写入操作会产生一个映射文件的复制,即私人的“写入时复制”(copy on write)对此区域作的任何修改都不会写回原来的文件内容。
MAP_ANONYMOUS建立匿名映射。此时会忽略参数fd,不涉及文件,而且映射区域无法和其他进程共享。
MAP_DENYWRITE只允许对映射区域的写入操作,其他对文件直接写入的操作将会被拒绝。
MAP_LOCKED 将映射区域锁定住,这表示该区域不会被置换(swap)。

参数fd:要映射到内存中的文件描述符。如果使用匿名内存映射时,即flags中设置了MAP_ANONYMOUS,fd设为-1。有些系统不支持匿名内存映射,则可以使用fopen打开/dev/zero文件,然后对该文件进行映射,可以同样达到匿名内存映射的效果。

参数offset:文件映射的偏移量,通常设置为0,代表从文件最前方开始对应,offset必须是分页大小的整数倍。

返回值:
若映射成功则返回映射区的内存起始地址,否则返回MAP_FAILED(-1),错误原因存于errno 中。

 

exp2:mmap读取文件内容

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/mman.h>
int main(){
	int fd;
	void *start;
	struct stat sb;
	fd=open("/etc/passwd",O_RDONLY);//许多函数具体见第5章IO
	fstat(fd,&sb);/*取得文件大小*/
	start=mmap(NULL,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0);/*文件映射到内存,始址为0,偏移量为0(从文件头开始)*/
	if(start==MAP_FAILED) return 0;/*映射失败 直接返回*/
	printf(" %s ", start);
	munmap(start,sb.st_size);/*解除映射*/
	close(fd);
	return 0;
}

《linux下的c语言系统函数调用》

 

exp3:获取文件属性

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main()
{
    const char fname[] = "main.c";
    struct stat stat_info;
    if(0 != stat(fname, &stat_info))
    {  
        perror("取得文件信息失败了!");
        exit(1);
    }
    printf("文件所在设备编号:%ld\r\n", stat_info.st_dev);
    printf("文件所在文件系统索引:%ld\r\n", stat_info.st_ino);
    printf("文件的类型和存取的权限:%d\r\n", stat_info.st_mode);
    printf("连到该文件的硬连接数目:%d\r\n", stat_info.st_nlink);
    printf("文件所有者的用户识别码:%d\r\n", stat_info.st_uid);
    printf("文件所有者的组识别码:%d\r\n", stat_info.st_gid);
    printf("装置设备文件:%ld\r\n", stat_info.st_rdev);
    printf("文件大小:%ld\r\n", stat_info.st_size);
    printf("文件系统的I/O缓冲区大小:%ld\r\n", stat_info.st_blksize);
    printf("占用文件区块的个数(每一区块大小为512个字节):%ld\r\n", stat_info.st_blocks);
    printf("文件最近一次被存取或被执行的时间:%ld\r\n", stat_info.st_atime);
    printf("文件最后一次被修改的时间:%ld\r\n", stat_info.st_mtime);
    printf("最近一次被更改的时间:%ld\r\n", stat_info.st_ctime);
    return 0;
}

《linux下的c语言系统函数调用》

mian.c在当前目录下

 

4.6数据结构中常用函数

函数名功能
bsearch二分法搜索
lfind/lsearch线性搜索,lsearch()找不到关键数据时会主动把改项数据加入数组里
qsort利用快速排序法排序数组

qsort()函数:
头文件:#include<stdlib.h>
void qsort(void* base,size_t n,size_t size,
            int(*compar)(const void*,const void*));
eg:qsort(base,n,sizeof(int),compar); //对数组base[n]排序
利用快速排序法排列数组
base指向要被搜索的数组的开头地址
n代表数组中元素数量
size为每一元素大小
compar为函数指针,数据相同时则返回0;不同时返回非0值。返回1时两个数据交换,返回-1时两个数据不交换.不可缺省

 

exp1:输入n,再输入n个整数,qsort()对n个整数进行排序

#include<stdio.h>
#include<stdlib.h>
#define m 70
int compar (const void *a,const void *b){
	int *pa=(int *)a,*pb=(int*)b;
	if(*pa>*pb) return 1;
	if(*pa == *pb) return 0;
	if(*pa < *pb) return -1;
}
int main(){
	freopen("input.txt","r",stdin);
	int base[m],n;
	int i;
	printf("input n(n<50):");
	scanf("%d",&n);
	for (int i = 0; i < n; ++i)	{
		scanf("%d",&base[i]);
	}
	printf("\n排序前:\n");
	for (int i = 0; i < n; ++i)	{
		printf("%d ",base[i]);
		if(i!=0&&i%10==0) printf("\n");
	}
	qsort(base,n,sizeof(int),compar);//必须有compar 没有会报错 无默认比较函数
	printf("\n排序后:\n");
	for (int i = 0; i < n; ++i)	{
		printf("%d ",base[i]);
		if(i!=0&&i%10==0) printf("\n");
	}
	printf("\n");
	return 0;
}

input.txt

10
6 7 -9 89 72 -89 0 10 7890 -909887

《linux下的c语言系统函数调用》

 

字符串查找

lfind函数:
头文件:#include<stdlib.h>
void *lfind(const void *key,const void *base,size_t *n,size_t size,int(* compar)(const void*,const void*));
函数功能:线性搜索,在数组中从头至尾,一项项查找数据
eg:lsearch(key,base,&n,size,compar);//char[] key;char[] base;int n;int size;
key:指向欲查找的关键数据的指针
base:指向要被搜索的数组开头的地址
n:数组中元素的数量
size:每一个元素的大小
compar:函数指针,相同返回0,不同返回非0
lfind和lsearch的不同点在于,当找不到关键数据时lfind()仅仅会返回NULL,而不会主动把该数据加入数组尾端。如果lsearch()找不到关键数据,会主动把该数据加入数组里。

bsearch函数说明:
void *bsearch(const void* key,const void *base,size_t n,size_t size,int(*compar)(const void*,const void*));
利用二分搜索法从排序好的数组中查找数据
key:指向欲查找的关键数据的指针
base:指向要被搜索的数组开头地址
n:数组中元素数量
size:每一元素的大小
compar:函数指针,数据相同时返回0,不同时返回

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    原文作者:奇迹是执着的人创造的
    原文地址: https://blog.csdn.net/hza419763578/article/details/83620446
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞