011_stdc_C语言
回顾:
1 const 限定存储空间的只读
int a[]; a=pa;
2 字符串
int float string 一串字符+ \0 就是字符串
char *str = "hello wolrd"
char pa[10]="hello";
%s 格式化占位符 char *str
gets(str) -->fgets() //
puts(str) --> 输出字符串
printf("hello world\n");
puts("hellow worold\n");
字符串里面的操作函数
strcpy 字符串复制
strcmp 比较字符串的大小
strlen 字符个数
strlen("好");
strcat 连接多个字符串
字符串转换练习
_______________
int atoi(char *str); //将一串字符转换为int
itoa //将int 转字符串
atof(); //"3.14" --> 3.14
char *p 指向一个字符串(字符指针)
1. 字符指针 数组
char *pa[5] //指向多个字符串
2.
char a[] //一个字符串
char a[5][10] //5个字符串,每个字符串9字符
3. char **ppa //字符串指针(字符串指针)
char a[5][10] ={"关羽","张飞","刘备","赵云","小乔"};
//输入一个姓名 ,判读 该同学是否在上面的名单中
#include <stdio.h> #include <string.h> int main(){ char a[5][10] ={"关羽","张飞","刘备","赵云","小乔"}; char name[10] = {0}; //用来存放输入的姓名 for(int i = 0;i<5;i++) { printf("%s\n",a[i]); } //输入一个姓名 ,判读 该同学是否在上面的名单中 printf("输入姓名:"); scanf("%s",name); for(int i = 0;i<5;i++) { if(0 ==strcmp(a[i],name)) printf("名单中有该同学\n"); } getchar(); getchar(); return 0; }
带参数的执行程序(命令) mkdir ls cd cp
第一种 int main(); 第二种 int main(int argc,char*argv[]);
argc argc 参数个数,也是字符串的个数
argv argv 记录所有字符串的内容
linux系统下
#include <stdio.h> #include <stdlib.h> int main(int argc,char*argv[]){ int sum = 0; printf("argc = %d\n",argc); for(int i = 1;i<argc;i++) { sum = sum + atoi(argv[i]); //printf("argv[%d] = %s\n",i,argv[i]); } printf("sum = %d\n",sum); return 0; }
---------------------
构建大型项目
程序的编译过程
预处理--> 编译--> 汇编--> 链接 -->可执行文件
main.c->main.i--> main.s main.o printf.o a.out
gcc -E main.c -o main.i 得到预处理后的文件main.i gcc -S main.i 得到main.s 文件,汇编源文件 gcc -c main.s 得到main.o 文件 gcc main.o 得到a.out 可执行文件
预处理
执行预处理语句, 以#开始的语句就是预处理语句
头文件
#include 将后面的文件 放到当前的.c 文件中
宏 #define 宏变量 #define PI 3.14 s = PI * r * r;
宏是暂时代替变量,预处理时把变量替换成数值
宏函数
#include <stdio.h> #define DOUBLE(n) ((n)+(n)) #define MAX(a,b) ((a)>(b)?(a):(b)) #define ABS(n) ((n)>=0?(n):-(n)) int max(int a,int b) { /* if(a>b) return a; else return b; */ return a>b?a:b; } int main(){ printf("max = %d\n",MAX(5*1,2+7)); printf("|-2| = %d\n",ABS(-2)); printf("|-7-2| = %d\n",ABS(-7-2)); getchar(); return 0; }
条件编译
#if 如果#if 后的常数 非0 编译语句参与编译
#else 如果#if 后的常数 为0 编译语句参与编译
#endif 条件编译#if结束
#define WIN //条件定义符号 WIN
#ifdef WIN //如果定义了符号WIN 编译下面的代码
#ifndef WIN //如果没有定义了符号WIN 编译下面的代码
#define WIN #undef WIN int max(int a,int b) { #ifdef WIN //#ifndef if(a>b) return a; else return b; #else return a>b?a:b; #endif }
内置宏定义
__FILE__ 当前.C 文件名
__LINE__ 文件的行号
__DATE__ 文件的编译日期
__TIME__ 文件的编译时间
#include <stdio.h> int main(){ printf("当前.c文件的文件名=%s\n",__FILE__); printf("当前代码的行号 %d\n",__LINE__); printf("当前可执行文件编译日期 %s\n",__DATE__); printf("当前可执行文件编译时间 %s\n",__TIME__);
//printf("使用的C编译器吗 %d\n",__STDC__);
getchar(); return 0; }
#include 文件查找方式
<> 系统目录 /usr/include/
"" 当前目录+系统目录
[练习]
编写add.c 文件 在该文件中 定义一个 int add(int a,int b)
编写add.h 文件 在该文件中声明 add 函数的原型
编写 main.c 在main函数中
#include add.h
调用add函数实现两个数的和,
编译测试 gcc main.c add.c
static 修饰函数时,限定该函数只能在 当前.c文件使用
static 修饰的函数名 在不同.c 文件中可以重名
static 修饰全局变量名 该变量限于在当前.c文件访问
extern 修饰函数名/变量名 具有外部链接属性
头文件 还可以包含头文件,用头文件卫士 避免(重复引用)
如:print.h头文件中
add.h投文件中
#目标:依赖的文件(目标顶格写,多个依赖文件用空格隔开) # 命令 (前面是一个tab键) [练习] 为add 编写一个makefile 文件 并用make进行编译 add:main.o add.o print.o gcc main.o add.o print.o -o add main.o:main.c add.h print.h gcc -c main.c add.o:add.c add.h gcc -c add.c print.o:print.c print.h gcc -c print.c