C语言是一种面向过程的结构化的语言,同时具有高级语言和汇编语言的优点
所有的C语言程序经过编译和连接之后才能被计算机执行
一、头文件
头文件是一种特殊的文件,记录了很多可以直接引用头文件然后使用的函数,也可通过#define声明函数、变量、宏等的定义
头文件通常包含在源代码中,可以被多个源文件包含使用。头文件以 .h
扩展名结尾,例如 stdio.h、stdlib.h 等
- stdio.h:声明了输入输出函数,例如 printf 和 scanf
- stdlib.h:声明了一些通用的函数,例如动态内存分配函数 malloc 和 free
- string.h:声明了一些字符串操作函数,例如 strlen 和 strcpy
- math.h:声明了一些数学函数,例如三角函数和指数函数
引用标准头文件使用尖括号<>,引用自己写的头文件,使用"",此时会优先在用户当前目录中寻找所需头文件
stdio.h——标准输入输出函数,包含输入函数(getchar()、gets()、scanf() 等)输出函数(putchar()、puts()、printf() 等)
#include <stdio.h> //预处理器指令,告诉 C 编译器在实际编译之前要包含 stdio.h 文件
int main() {
printf("Hello, world!\n");
return 0;
}
/*这是C语言自己的注释符*/
//这是C++的注释符
函数在调用之前必须要声明,声明写在cpp文件, 写在主函数里面需要在调用之前写声明(告诉主函数有这么一个函数),写在主函数前面则不用再写声明
模板函数需要写在.h文件里面,实现写在另一个cpp文件
每个声明后面都要有分号
二、基本输入输出函数
代码执行是在操作系统中申请一个线程,线程是进程的子集
1、主函数
主函数是C语言程序执行的入口,是操作系统调用的函数——所有的程序都是从main()函数开始执行的,return 0 表示程序正常退出
main()函数也可作为其他编程语言连接C语言的入口
主函数可以带参数,也可以不带参数——带参数的话,C语言规定要有两个参数:
main (int argc,char *argv[ ]) 或者 int main (int argc,char **argv)
main() 函数参数
argc(arguments count(参数计数))表示参数的个数,参数是从第二位开始传入,但参数个数是输入的所有元素的和,包括文件名
*argv[] (arguments value/vector(参数值))表示一个参数是字符指针的数组,数组内的每个元素都是一个字符指针,每个指针都指向一个字符串
由于main函数不能被其他的函数调用,所以不可能在程序内部取得实际值,只能在命令行里面取得——也就是说,在命令行下输入文件名+实际参数,这些实际参数就会从第二位开始传到指针数组里面
C语言main函数还有一个参数——char *argv[ ]
2、输入函数
标准输入输出库stdio.h的输入函数有getchar()、gets()、scanf()等
getchar() 函数
getchar() 函数每次只能在终端(输入设备)输入一个字符,返回值为该字符的ASCII码,该函数没有参数,读取失败的时候会返回EOF,语法为
int getchar();
一般会将接受的字符赋值给一个字符变量或者整形变量,还可以作为表达式的一部分——putchar(int getchar()); 表示将getchar()作为putchar()函数的参数
getchar() 函数在读取到\n的时候跳出循环,程序继续往下执行;读取到EOF的时候停止读取
printf()格式化输出的时候使用%c——表示占位一个字符——读取时不会忽略空白符
gets() 函数
gets() 函数用于获取用户在终端输入的一个字符串,语法如下:
char *gets(char *str)
字符指针str是形式参数,主要用于存储获取的字符串
读取过程中,遇到空格不会停止
出现换行符、回车、EOF(文本文件结束符 ctrl+z)的时候会转换为字符串中的结束符 “\0”—— 此时停止读取——数据最后的空白符会被直接舍弃,所以读什么输什么,不会输出之间的空白符
scanf() 函数
格式化输出的格式使用双引号括起来
scanf() 函数用于按照指定格式接收用户在终端的输入,并按序存储在指定变量中,语法如下
scanf("%d",&iInt); //&表示取地址
scanf() 函数与缓冲区(格式)
scanf() 函数的接收原理是行缓冲——接收一串字符时,回车之后才能读取到,打印的时候,先传字符串,回车留在缓冲区里,然后再传回车
scanf() 函数:遇到不符合读取规则的数据时,读取失败,退出程序,但不符合输入格式的数据仍会保存在缓冲区,等待下一次读取,读取之后或者手动清除后才会消失 —— 一般一次传参完成之后都需要清空缓冲区,防止下次传参出现问题
Ⅰ、scanf() 函数以 “%d” 的格式接收数据(%f 同理)
接收数据时以空白符作为两个参数之间的分割(空白字符包括:空格、回车换行、制表符),输出时只会读取有效数据,不会输出空白符
Ⅱ、以 “%s” 的格式接收数据
接收数据时会忽略有效数据前面的空白符,读到数据之后再次读取到空白符后会停止读取,然后在读取到的字符串后面自动加一个 '\0' 作为结束标志——剩余内容仍在缓冲区内,下次读取的时候,会忽略空白符,只读取有效字符
Ⅲ、以 “%c” 的格式接收数据
不会忽略任何空白符,默认没有分隔符,所有按键敲下的字符都会被认为是输入——可以通过在参数之间加getchar()函数吸收空白符
scanf() 函数的格式化传参
# scanf("a=%d",&a); scanf("b=%d",&b);
中间不能留有空格和回车,否则就会读取失败——可以在参数之间加一个getchar()函数吸收空格
# scanf("%s,%d",&a,&b);
scanf需先读取一个字符串,再读取一个 ',',最后读取一个整数
# scanf("%d\t%d",&a,&b);
scanf需先读取一个整数,再将格式化字符串中的 ‘\t’ (空白字符)与缓冲区中0个或多个空白字符匹配并清除,最后读取一个整数
# scanf("%d%d",&a,&b);
scanf需要先读取一个整数,之后再读取一个整数,两个整数之间的空白字符会被忽略
# scanf("%c %c", &a, &b);
此时字符传参时,可以在中间加一个空格
3、输出函数
putchar() 函数
putchar() 函数每次只能输出单个字符,参数ch可以是字符型、整型、实型常量(浮点数)或者变量的常量值
putchar(int ch);
常量要使用单引号引起来,变量不需要
如果函数参数为整数,则会返回对应的ASCII码的字母
puts() 函数
puts() 函数一次可以输出多个字符,主要用于输出一个字符串并换行,语法格式如下
puts(char *str);
其中字符指针变量*str是形参,主要用于接收要输出的字符串
puts() 函数输出字符串遇到 \0(编译器在字符串后加 \0 ),之后字符不再输出,然后自动换行
一般来说——字符使用单引号,字符串使用双引号
左杠注释除取商,右杠转义0换行
printf() 函数
printf() 函数格式化输出函数,格式化输出的格式控制使用双引号括起来,语法如下
printf("%d",变量/表达式);
- 格式输出时,要输出双引号须在双引号内写为 \"
- 要输出百分号,双写即可 %%
- 格式控制比传输列表多时,多余的输出为不定值
- 格式控制比输出列表少时,输出列表的多余的内容不输出
printf() 函数压栈顺序——从左到右:栈底-->栈顶;计算顺序——从上到下;结果顺序——从下到上(先出的在最后一个,后出的结果显示在第一位,按照输出列表的正常顺序出栈)—— 顺序压栈,逆序计算,顺序输出结果
printf() 函数与堆栈(自增)
1、printf输出的时候,每次的自增都作为下次自增的输入
2、自增运算中的++a属于临时变量,每个++a的结果都和最后一次自增的结果一样
3、自增运算中的a++输出当前的值作为结果
小结 ———————— 值是定值,a是+a,列好堆栈,倒序计算(顺序输出)