c语言学习笔记2

c语言学习笔记2

c输入与输出
标准文件 文件指针 设备
标准输入 stdin 键盘
标准输出 stdout 屏幕
标准错误 stderr 屏幕
I/O(输入/输出):通常使用printf()和scanf()两个函数
scanf()函数用于从标准输入(键盘)读取并格式化,printf()函数发送格式化输出到标准输出(屏幕)
printf函数中可使用format进行格式化的输出
这两个函数都在stdio.h头文件中

getchar()&putchar()函数
int getchar(void)函数从输入流读取下一个可用的字符,并把它返回一个整数,这个函数在同一时间内只会读取单一的字符
int putchar(int c)函数把字符输出到屏幕上,并返回相同的字符,这个函数在同一时间内只会输出单一的字符,可使用循环读取多个

gets()&puts()函数
char *gets(char *s)函数从stdin读取一行到s所指向的缓冲区,直到一个终止符或EOF
int puts(const char *s)函数把字符串s和一个尾随的换行符写入到stdout

c文件读写
打开文件:fopen()函数用于创建一个新的文件或打开一个已有的文件,
原型:
FILE *fopen(const char *filename,const char *mode);
filename为字符串,即文件名,mode为对文件的权限操作,如下:
r 打开一个已有的文本文件,允许读取文件
w 打开一个文本文件,允许写入文件,如果文件不存在,则创建一个新文件。注:会从文件的开头写入,即原本文件中内容会被清空
a 打开一个文本文件,以追加模式写入文件,如果文件不存在,则会创建一个新文件。
r+ 打开一个文本文件,允许读写文件
w+ 打开一个文本文件,允许读写文件,如果文件存在,会被截断为零长度,如果文件不存在,会创建一个新文件
a+ 打开一个文本文件,允许读写文件,如果文件不存在,会创建一个新文件,读取会从文件的开头开始,写入则只能是追加模式
如果处理的是二进制文件,则需要使用如下访问模式来:
“rb”,“wb”,“ab”,“rb+”,“r+b”,“wb+”,“w+b”,“ab+”,“a+b”

关闭文件:int fclose(FILE *fp);
如果成功关闭文件,fclose函数返回零,如果关闭文件时发生错误,函数返回EOF,这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存,EOF是一个定义在头文件stdio.h中的常量。

写入文件:
int fputc(int c,FILE *fp);
fputc()函数把参数c的字符值写入到fp所指向的输出流中,如果写入成功,返回写入的字符,如果发生错误,会返回EOF。
int fputs(const char *s,FILE *fp);
fputs()函数把字符串s写入到fp所指向的输出流中,如果写入成功,会返回一个非负值,如果发生错误,会返回EOF。
int fprintf(FILE *fp,const char *format,…)
把一个字符串写入到文件中

读取文件
int fgetc(FILE *fp);
从fp所指向的输入文件中读取一个字符,返回值是读取的字符,如果发生错误返回EOF。
char *fgets(char *buf,int n,FILE *fp);
从fp所指向的输入流读取n-1个字符,会把读取的字符串复制到缓冲区,并在最后追加一个null字符终止字符串,如果在读取最后一个字符之前就遇到了换行符’\n’或文件的末尾EOF,则只会返回读取到的字符,包括换行符。
int fscanf(FILE *fp,const char *format,…);从文件中读取字符串,但在遇到第一个空格和换行符时,会停止读取。

c预处理器
不是编译器的组成部分,但是它是编译过程中一个单独的步骤
简言之,c预处理器是一个文本替换工具,会指示编译器在实际编译之前完成所需的预处理。
所有的预处理命令都是以#开头,它必须是第一个非空字符,为了增强可读性,预处理要放在c文件最前面
重要的预处理器命令:
指令 描述
#define 定义宏
#include 包含一个源代码文件
#undef 取消已定义的宏
#ifdef 如果宏已定义返回真
#ifndef 如果宏没有定义,返回真
#if 如果给定条件为真,则编译下面代码
#else #if的替代方案
#elif 如果前面的#if给定条件不为真,当前条件为真,编译下面代码
#endif 结束一个#if…#else条件编译块
#error 当遇到标准错误时,输出错误消息【无标题】【无标题】
#pragma 使用标准化方法,向编译器发布特殊的命令到编译器中

c头文件
头文件是扩展名为.h的文件,包含了c函数声明和宏定义,被多个源文件中引用共享。
引用头文件的语法:#include
引用头文件的操作:使用头文件内的函数和宏定义
只引用一次头文件,不要多次引用一个头文件,编译器会处理多次头文件的内容,会产生错误。
有条件引用,有时需要从多个不同的头文件中选择一个引用到程序中。例如,需要指定在不通的操作系统上使用的配置参数。

c强制类型转换
语法:(type_name)expression;
将变量expression强制转换成type_name类型
例:
#include <stdio.h>
int main()
{
int sum = 17, count = 5;
double mean;
mean = (double) sum / count;
printf(“Value of mean : %f\n”, mean );

}

常用的算术转换
常用的算术转换是隐式地把值强制转换为相同的类型。编译器首先执行整数提升,如果操作数类型不同,则它们会被转换为下列层次中出现的最高层次的类型:long double,double,float,unsigned long long,long long,unsigned long,long,unsigned int,int。
最高层次为long double。
常用的算术转换不适用于赋值运算符、逻辑运算符 && 和 ||。

c错误处理
c语言不提供对错误处理的直接支持,但是作为一种系统编程语言,它以返回值的形式运行程序员访问底层数据,在发生错误时,大多数的C或UNIX函数调用返回1或NULL,同时会设置一个错误代码errno,该错误代码是全局变量,表示在函数调用期间发生了错误。可以在errno.h头文件中找到各种各样的错误代码。
所以,C 程序员可以通过检查返回值,然后根据返回值决定采取哪种适当的动作。开发人员应该在程序初始化时,把 errno 设置为 0,这是一种良好的编程习惯。0 值表示程序中没有错误。
errno()、perror()和strerror()
perror()和strerror()函数可以显示与errno相关的文本消息
perror()函数显示传给它的字符串,后跟一个冒号,一个空格和当前errno值的文本表示形式。
strerror()函数,返回一个指针,指向当前errno值的文本表示形式。

c递归
递归是指在函数的定义中使用函数自身的方法
语法
void recursion()
{

recursion();
}
注:使用递归时,需要注意定义从函数推迟到条件,否则会进入死循环
使用递归的经典案例:汉诺塔,数的阶乘,斐波那契数列

c可变参数
函数带有可变数量的参数。
使用stdarg.h头文件,该文件提供了实现可变参数功能的函数和宏。
具体步骤如下:
定义一个函数,最后一个参数为省略号,省略号前面可以设置自定义参数。
在函数定义中创建一个 va_list 类型变量,该类型是在 stdarg.h 头文件中定义的。
使用 int 参数和 va_start 宏来初始化 va_list 变量为一个参数列表。宏 va_start 是在 stdarg.h 头文件中定义的。
使用 va_arg 宏和 va_list 变量来访问参数列表中的每个项。
使用宏 va_end 来清理赋予 va_list 变量的内存。
例:

#include <stdio.h>
#include <stdarg.h>
double average(int num,...)
{【无标题】
    va_list valist;【无标题】
    double sum = 0.0;
    int i;
    /* 为 num 个参数初始化 valist */
    va_start(valist, num);
    /* 访问所有赋给 valist 的参数 */
    for (i = 0; i < num; i++)
    {
       sum += va_arg(valist, int);
    }
    /* 清理为 valist 保留的内存 */
    va_end(valist);FILE *file = fopen(file_name,"rb");
	if(!file)
	{
    return sum/num;
}
int main()
{
   printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5));
   printf("Average of 5, 10, 15 = %f\n", average(3, 5,10,15));
}

c内存管理
在头文件stdlib.h中
void calloc(int num,int size); 在内存中动态地分配num个长度为size的连续空间,并将每一个字节都初始化为0。所以它的结果是分配了numsize个字节长度的内存空间,并且每个字节的值都是0。
void free(void *address);该函数释放address所指向的内存块,释放的是动态分配的内存空间。
void *malloc(int num);在堆内分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会呗初始化,它们的值是未知的。
void realloc(void address,int newsize);该函数重新分配内存,把内存扩展到newsize。
注:void
类型表示未确定类型的指针。c规定void
类型可以通过类型强制转换为任何其他类型的指针。
动态分配内存,手动分配内存,用到的时候分配
例如:链表【无标题】

重新调整内存的大小和释放内存
free()函数用于释放内存
realloc()函数来增加或减少已分配内存块的大小

c命令行参数
命令行参数是使用main()函数参数来处理的,其中argc是指传入参数的个数,argv[]是一个指针数组,指向传递给程序的每个参数。
注:argv参数的下标从1开始,argv[0]是默认为运行的程序名。如果没有提供任何参数argc为1。
多个命令行参数之间用空格分隔,如果参数本身带有空格,传递参数的时候应给参数加上单引号或者双引号。

c排序算法
冒泡排序
选择排序
插入排序
希尔排序
归并排序
快速排序

此笔记是学习菜鸟教程c语言记录的笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值