一。 c语言标准库介绍
stdlib里的是常用系统函数,跟系统调用相关的,比如内存申请malloc和释放free
stdio是标准io函数,比如printf和scanf函数
所有参考函数 来自 :http://www.he11oworld.com/c-shouce/
http://www.runoob.com/cprogramming/c-tutorial.html
二。c语言参考案例
宏定义
宏是在gcc编译预处理阶段就会执行的代码
//#pragma命令可以让编程者让编译器执行某些事
#include <stdio.h> //包含io流的库 标准的输入和输出 ""首先在当前目录下寻找,如果找不到,再到系统目录中寻找
<>直接去系统目录中找
#define True 0
#define toString(s) #s
#define concat(x,y) x ## y
#define add(a,b) a+b
#define max(a,b) a>b?a:b
void myadd(int a,int b) {
}
int main() {
printf("%s\n",toString("替换"));//#s 预编译阶段这里编程 printf("%s\n","替换\n")
int xy=100;
printf("%d\n",concat(x,y)); //x##y连接成 xy 预编译 这里 printf("%d\n",xy)
printf("%d\n",add(10,11)); //这里直接被替换成 printf("%d\n",10+11);
int a=100;
int b=10;
printf("%d\n",max(a,b)); //这里直接被替换成 printf("%d\n",a>b?a:b);
/**
* 下列参数在不同的编译器可能会有所不同, 但是一般是可用的:
__LINE__ 和 __FILE__ 变量表示正在处理的当前行和当前文件.
__DATE__ 变量表示当前日期,格式为month/day/year(月/日/年).
__TIME__ 变量描述当前的时间,格式为hour:minute:second(时:分:秒).
_cplusplus 变量只在编译一个C++程序时定义.
__STDC__ 变量在编译一个C程序时定义,编译C++时也有可能定义.
*/
//获取当前的文件名 当前行号
printf("%s--%d\n", __FILE__,__LINE__ );
#line 10 "a.cpp" //下一行就变成第10行了 文件名改成了a.cpp可以动修改上面两个变量的值
int i=1000;
printf("%s--%d\n", __FILE__,__LINE__ );
#ifdef True //是否定义这个宏 上面已经定义了 不管真假 if系列 #if, #ifdef, #ifndef, #else, #elif, #endif
printf("Hello, World!\n");
#endif
#if True //判断宏是否大于0的值
printf("Hello, World!\n");
#endif
//#undef命令取消一个先前已定义的宏变量, 譬如一个用#define定义的变量.
#undef True
return 0;
}
关于指针和函数的指针 记录下
#include <stdio.h>
#include <stdlib.h>
#include "string.h"
int add(int x,int y);
int main() {
int (*p)(int,int); //定义函数指针 使用 (*名称) 注意 p可以是指向了一个int返回值 两个int型函数的指针
int *p1(int,int);//这是一个函数定义 返回一个 int*
int p2(int,int); //这也是函数定义返回一个int
p=add;
int result=(*p)(11,12);
printf("%d\n",result);
int i=10;
printf("%d\n",&i);//拿到i的地址
printf("%d\n",i);// 输出i的值
printf("%d\n",*&i);//*地址 就可以拿到对应地址的值 也就是10
int *g; //定义了指针 g就是个地址
g=&i;
printf("%d\n",*g);//*地址 就可以拿到对应地址的值 也就是10
}
int add(int x,int y){
return x+y;
}
基本数据类型
C语言包含5个基本数据类型: void, integer, float, double, 和 char.
类型 | 描述 |
---|---|
void | 空类型 |
int | 整型 |
float | 浮点类型 |
double | 双精度浮点类型 |
char | 字符类型 |
一些基本数据类型能够被 signed, unsigned, short, 和 long 修饰. 当类型修饰符单独使用的时候, 默认的类型是 int. 下表是所有可能出现的数据类型:
bool |
char |
unsigned char |
signed char |
int |
unsigned int |
signed int |
short int |
unsigned short int |
signed short int |
long int |
signed long int |
unsigned long int |
float |
double |
long double |
wchar_t |
基本数据类型的大小以及能够表示的数据范围是与编译器和硬件平台有关的. "cfloat" (或者 "float.h") 头文件往往定义了基本数据类型能够表示的数据的最大值和最小值. 你也可以使用 sizeof 来获得类型的大小(字节数) . 然而, 很多平台使用了一些数据类型的标准大小,如. int 和 float 通常占用 32位, char 占用 8位, double 通常占用64位. bools 通常以 8位 来实现.
io操作
c语言在stdio.h中提供了三个宏 stdout, stdin, stderr 分别为标准输出,标准输入,标准错误 ,stdin的默认是从键盘输入,stdout和stderr的默认是输出到屏幕上。但是stdout和stderr二者输出是有区别的:
stdout输出和printf输出一样,带有缓存区的输出,先将数据输到缓存区里在遇到换行或者程序结束后输出到屏幕。
stderr输出和cerr、flush函数类似,它也是错误输出,直接输出到屏幕,不经过缓存区
具体库函数 查看 (http://www.runoob.com/cprogramming/c-standard-library-stdio-h.html)
标准的输入输出一些简单操作
char s[20];
int i;
printf("请输入一个字符串:");
scanf("%s %d",s,&i);//空格隔开接受两个参数 比如 abc 100 s就是abc i就是100
size_t si=strlen(s);
printf("%s 长度:%d\n",s,si);
//输出一个字符串 98 对应acscii的 b 到stdout中
putchar(98);
//从标准输入流 stdin中获取一个字符串
int ac=getchar();
char s1[20];
//将第三个字符串通过第二个格式化字符串 格式化到s1变量中
sprintf(s1,"%d",20);
printf(s1);
文件操作(所有f开头的函数) 参考(http://www.runoob.com/cprogramming/c-standard-library-stdio-h.html)
#include <stdio.h> //包含io流的库 标准的输入和输出
void testRead(){
//返回一个文件对象 注意关闭 后面的模式有以下几种
/**
模式 描述
"r" 打开一个用于读取的文件。该文件必须存在。
"w" 创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。
"a" 追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。
"r+" 打开一个用于更新的文件,可读取也可写入。该文件必须存在。
"w+" 创建一个用于读写的空文件。
"a+" 打开一个用于读取和追加的文件。
* **/
FILE* ff=fopen("c:/a.txt","r");
//fgetc读取一个字符
printf("%c\n",fgetc(ff));
//读取一行
/*也可以使用fgets 需要设置缓冲区
* FILE *fp;
char str[256];
fgets(str, 256, fp);
* */
char sz[256];
fseek(ff,0,SEEK_SET);//设置指针为0 因为之前读取过一个字符 重头开始读
fscanf(ff,"%s",sz);
printf("%s\n",sz);
/**
* fseek第三个参数表示从哪里开始移动指针 头开始 当前位置开始 末尾开始
* origin:表示指针移动的起始位置,可设置为以下三种情况之一:
SEEK_SET: 文件开始位置
SEEK_CUR: 文件当前位置
SEEK_END: 文件结束位置
*/
fseek(ff,0,SEEK_END);//设置ff指针到离文件末尾0个距离 当然返回了文件的长度
int length=ftell(ff);//ftell获取当前指针的位置 已经到末尾了就是文件的长度
printf("文件长度:%d",length);
}
void readAll(){
FILE* ff=fopen("c:/a.txt","r");
//判断是否到达末尾
while(!feof(ff)){
char sz[256];
fscanf(ff,"%s",sz);
printf("%s\n",sz);
}
fclose(ff);
}
void testWrite(){
FILE* ff=fopen("c:/a.txt","a");
fputc(100,ff);
//打印到文件中 ff替换成stdout就输出到控制台
fprintf(ff,"\n%s","hello");
fclose(ff);
}
int main() {
testRead();
//从标准输入流 读取一个字符串 也就是控制台会卡顿
char c=fgetc(stdin);
//将内容写到标准输出 也就是控制台
fputc(98,stdout);
return 0;
}
字符串处理
string .h 头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。
c语言中字符串的定义 使用 char * a或者 char a[20] 这种连续的字符
详细参考 http://www.runoob.com/cprogramming/c-standard-library-string-h.html
#include <stdio.h> //包含io流的库 标准的输入和输出
#include <string.h>
int main() {
char * a="hello";//指针类型字符串内存根据指定的字符决定的
//未给定字符的char* 是个NULL值 只有指针才可以判断NULL 字符串应该是 “”
char * a1=NULL;
a1="good";
char b[100]="zs";
printf("%s %s %s\n",a,b,a1);
printf("字符串的长度:%d\n",strlen(a));
char s[200]="hello ";
//------将 b的内容追加到s上
strcat(s,b);
printf("拼接后字符串:%s\n",s);
//-------找到一个字符串在另一个字符的位置
char * src="a.txt";
char desrc='.';
printf("找到字符的位置后面的值:%s\n",strchr(src,desrc));//输出 .txt
//--------字符串转换大小写 指针定义的字符串无法转换 char *a="" 不能转换 使用数组定义的可以转换 char a[]="abc"
char hl[200]="hello";
strupr(hl);//strlwr()转换小写
printf("转换大写:%s\n",hl);
//--------切割字符串
char h2[200]="zs,ls,ww";
/*
char* cc=strtok(h2,",");//返回第一个字符 接下来的字符strtok(NULL,",")
char* scc=strtok(NULL,",");
char* tcc=strtok(NULL,",");
printf("切割的字符串是:%s--%s--%s\n",cc,scc,tcc);*/
char* cl=strtok(h2,",");
while(cl!=NULL){
printf("切割的字符串是:%s\n",cl);
cl=strtok(NULL,",");
}
//--------比较字符串
printf("字符串是否相等:%d\n",strcmp("a","b"));//0相等 -1不相等
//--------一个字符串在另一个字符串的位置
printf("字符串的位置是:%s\n",strstr("a_b","_"));//和strchr一样
return 0;
}
数学库
参考 http://www.runoob.com/cprogramming/c-standard-library-math-h.html
日期和时间库
参考 http://www.runoob.com/cprogramming/c-standard-library-time-h.html
#include <stdio.h> //包含io流的库 标准的输入和输出
#include <string.h>
#include "time.h"
int main() {
//获取 UTC=GMT(格林威治时间)的时间戳(1970-01-01 00:00:00 UTC)起经过的时间,以秒为单位)
//中国是东八区 离格林威治8个区
//时间区 决定了你要+多少个小时 东八区+8个小时
//时间戳统一是 GMT 不同地区时间戳都是相同的
time_t tt;
time(&tt);
printf("时间戳:%d\n",tt);
//通过时间戳获取一个本地时区的格式化时间 格式:Www Mmm dd hh:mm:ss yyyy
printf("格式化时间:%s\n",ctime(&tt));
struct tm * gmtm=gmtime(&tt);
printf("gmt时间年份是:%d-%d-%d\n",gmtm->tm_year+1900,gmtm->tm_mon+1,gmtm->tm_mday);
printf("gmt时间ascii年份是:%s\n",asctime(gmtm));//等价于ctime
//传入时间戳 获取本地时区的时间
struct tm* tmm;
tmm=localtime(&tt);
printf("年份是:%d-%d-%d\n",tmm->tm_year+1900,tmm->tm_mon+1,tmm->tm_mday);
return 0;
}
内存处理
stdlib.h 定义了常用的一些函数 比如内存分配释放,变量类型转换,环境变量,随机数等一些处理函数
参考 http://www.runoob.com/cprogramming/c-standard-library-stdlib-h.html
#include <stdio.h> //包含io流的库 标准的输入和输出
#include <string.h>
#include "stdlib.h"
int main() {
typedef struct {
int i;
float j;
char s[20];
} A;
//void *calloc( size_t num, size_t size ); 函数返回一个指向num 数组空间,每一数组元素的大小为size。如果错误发生返回NULL。
A* c=calloc(10, sizeof(A));//创建了10个A结构 连续的 每个结构体大小可以通过sizeof算出来 A*就是个A结构的数组
c[0].i=10;
c[0].j=100;
realloc(c,11);//重新将cc分为了11个结构体
printf("输出结果:%d",c[0].i);
free(c);
A* a=(A*)malloc(sizeof(A)); //创建一个A对象
a[0].i=100;
printf("输出结果:%d",a[0].i);
free(a);
return 0;
}
类型转换
stdlib.h 定义了常用的一些函数 比如内存分配释放,变量类型转换,环境变量,随机数等一些处理函数
#include <stdio.h> //包含io流的库 标准的输入和输出
#include "stdlib.h"
int main() {
float r= atof("12.34");//字符串转换成float类型;
printf("%.2f\n",r);
int i=atoi("12");
printf("%d\n",i);
//任意类型转换成char*字符串
char c[20];
sprintf(c,"%d",20);//格式字符串自定义都可以转换
printf("%s\n",c);
return 0;
}
其他c函数
#include <stdio.h> //包含io流的库 标准的输入和输出
#include "stdlib.h"
int main() {
char * path=getenv("PATH");
printf("path:%s",path);
system("notepad"); //调用系统的命令
int k=rand();
printf("随机数:%d",k);
return 0;
}
linux库函数参考文档 https://download.csdn.net/download/liaomin416100569/10723729