/* ====================================== *
* Copyright (c) 2005 Tsinghua University *
* Name: 《21天学通C语言》读书笔记 *
* Author: Zou Xin *
* ====================================== */
* -------------------------------- *
* 第 4 天课程 语句、表达式和运算符 *
* -------------------------------- *
> 要将字面字符串常量放在多行中,必须在换行之前加上反斜杆(\)。
例如:
printf("Hello,
world!");//F
printf("Hello,\
world!");//T
> w * x / ++y + z / y //在编程中,应避免使用这种不确定的表达式
* ---------------------------- *
* 第 5 天课程 使用函数封装代码 *
* ---------------------------- *
> 内联函数
内联函数通常很短。编译器将尽可能使内联函数的执行速度最快,这可能通过将函数的代码复制到调用函数中来实现。由于将在调用函数中执行这种函数的代码,因此称为“内联”。
The inline specifier instructs the compiler to replace function calls with the code of the function body.
* ------------------------------ *
* 第 6 天课程 基本的程序流程控制 *
* ------------------------------ *
> for 语句的工作原理
for (initial; condition; increment)
statement;
假 -> for 语句结束
执行表达式initial -> 判断condition -〈 〉-> 执行表达式increment
真 -> 执行statement语句
> 与while语句不同,do...while循环体中的语句至少执行一次
* ------------------------ *
* 第 7 天课程 信息读写基础 *
* ------------------------ *
> 要打印一个百分号,必须使用两个百分号%%
> puts()函数接受一个字符串参数,显示该参数并自动换行。而且puts()的开销较printf()小。
> 三字符序列(e.g. "??=" 对应的字符为 "#")
* ------------------------ *
* 第 8 天课程 使用数值数组 *
* ------------------------ *
> 对于大多数编译器来说,不能使用const关键字定义的符号常量来指定元素数目:
const int MONTHS = 12;
int array[MONTHS];/* wrong! */
* ---------------- *
* 第 9 天课程 指针 *
* ---------------- *
> 指针变量之间可以进行算术求差运算,即将两个指针相减。例如下面的表达式告诉你两个元素之间的距离(它们之间的元素数):
ptr1 - ptr2;
此外,指针变量之间也可以进行比较( !=、==、> 、< 、>= 、<= )。
> 注意事项:不要在赋值语句的左边使用未被初始化的指针变量,这可能会造成严重的后果。
* ------------------------- *
* 第 10 天课程 字符和字符串 *
* ------------------------- *
> 使用完 malloc() 函数分配的内存后,应使用 free() 函数将其返回给系统。
> scanf() 函数的返回值为成功输入的字符串数目
* ---------------------------------- *
* 第 11 天课程 结构、共用体和TypeDef *
* ---------------------------------- *
> 如果p_str是指向结构str的指针,则下面的三个表达式是等价的:
(*p_str).memb
p_str->memb
> 与其他数据类型一样,也可以将结构体作为参数传递给函数。
> 为了避免混淆,只允许初始化共用体的第一个成员。
> 可以使用关键字typedef给结构体或共用体类型创建别名。方法如下例:
typedef struct
{
int x;
int y;
}coord;
coord topleft;
coord bottoright;
* ----------------------- *
* 第 12 天课程 变量作用域 *
* ----------------------- *
> 如果没有显示地初始化外部变量,那么在定义外部变量时,编译器将把它初始化为0。
> extern关键字指出“该函数使用了一个在其他地方定义的外部变量,其名称是什么,
类型是什么。”
> 静态变量只在函数首次被调用时初始化一次,以后调用时,程序知道该变量已被初始
化,因此不会再次初始化,而变量仍为前一次退出函数时的值;而对于动态变量,每次
函数被调用时,都会被初始化为指定的值。
> 常规外部变量对于其所在文件中的所有函数而言都是可见的,同时其他文件中的函数
也可以使用它;而静态外部变量只位于它所在的文件中,且在它的定义之后的函数中可
见。
> 寄存器变量(register)
关键字register只能用于简单的数值变量,而不能用于数组和结构体。另外,它也不能
用于静态变量和和全局变量。您不能定义指向寄存器变量的指针。
> 不要在main()函数中声明静态局部变量,因为这样做毫无意义。
> 在局部变量的作用域内,程序将暂时忽略全局变量。
* ----------------------------- *
* 第 13 天课程 高级程序流程控制 *
* ----------------------------- *
> break & continue
| ------------------ |
|while (...) <----|--|
|{ | |
| ... | |
|continue;--|--|
|... |
|break; ----|--|
|... | |
|... | |
| } | |
| ------------------ | |
<-------|
> 别忘了必要时在switch语句中使用break语句。
> 死循环指的是如果没有外力的干预,将永远执行下去的循环。
> exit(status);
函数终止程序的执行,并将控制权归还给操作系统。
如果status为0(or EXIT_SUCCESS),则表明程序正常终止;如果为1(or EXIT_FAILURE),
则表明程序终止时发生了某种错误。
要使用exit()函数,程序必须包含头文件stdlib.h。
> C语言的标准库中包含一个system()函数,它让您能够在一个正在运行的程序中执行操
作系统命令。要使用此函数,程序必须包含头文件stdlib.h。
* ----------------------------------- *
* 第 14 天课程 操纵屏幕、打印机和键盘 *
scanf返回值被忽略是怎么回事* ----------------------------------- *
> 流的概念
> 可以根据是否缓冲和回显来将字符输入函数分类:
* 有些字符输入函数进行缓冲。这意味着操作系统把所有的字符保存在一个临时存储空间
内,直到用户按下Enter键后,再将它们发送到stdin流。其他一些不进行缓冲,这意味
着每当用户按下一个键后,相应的字符将被立刻发送到stdin流。
* 有些输入函数将每个字符回显到stdout。有些不回显,而只是将字符发送到stdin,而不
是stdout。由于stdout对应的是屏幕,因此输入将被回显到屏幕上。
例如:getchar()读取stdin流中的下一个字符,它具备缓冲和回显的功能。而getch()函
数读取stdin流中的下一个字符,它不对输入字符进行缓冲,也不回显。getche()类似于
getch(),只是它会将字符回显到stdout。
# >>>>>>>>>>>>>>> #
# 说明:getch()函数并非ANSI标准的一部分,并非在所有的系统中都可以使用它。使用 #
#该函数时应包含头文件<conio.h> #
# >>>>>>>>>>>>>>> #
> 当用户按下Enter键后,键盘设备将一个回车发送给stdin。对输入进行缓冲的字符输入
函数会自动把回车转换为换行符,因此程序必须检测字符是否为\n,来确定用户是否按下
了Enter键。不对输入进行缓冲的字符输入函数不进行这种转换,因此回车仍然为\r,因此
程序必须检测\r。
> 清楚stdin中多余的字符,以免发生错误的方法:
一、在一个单独的函数(例如可以命名为clear_kb())中调用gets();
二、使用fflush()函数。原型:int fflush(FILE *stream);
表 1scanf()的转换说明符中使用的类型说明符
___________________________________________________________________________________ 类型|参数|含义
--------+---------------+---------------------------------------------------------- d|int*|十进制整数
-
-------+---------------+---------------------------------------------------------- i|int*|十进制、八进制(以0开头)或十六进制(以0x或0X开头)整数
--------+---------------+---------------------------------------------------------- o|int*|八进制整数(以0打头,也可以不以打头)
--------+---------------+---------------------------------------------------------- u|unsigned int*|无符号十进制整数
--------+---------------+---------------------------------------------------------- x|int*|十六进制整数(以0x或0X打头,也可以不以它们打头)
--------+---------------+---------------------------------------------------------- c|char*|读取一个或多个字符。不在末尾加上空字符
--------+---------------+---------------------------------------------------------- s|char*|将一个有非空白字符组成的字符串存储到指定的内存单元中,||并在末尾加上空字符。
21天学通C语言
--------+---------------+----------------------------------------------------------a,e,f,g|float*|浮点数。输入该数字时,可以使用科学计数法,也可以使用小||数点表示法
--------+---------------+---------------------------------------------------------- [...]|char*|一个字符串。只读取方括号中列出的字符。遇到不匹配的字符、||达到指定的字段宽度或用户按Enter键后,立刻停止读取。为读
||取字符],应首先将它列出:[]...]。将在字符串末尾加上空字符。--------+---------------+---------------------------------------------------------- [^...]|char*|与[...]相同,不过只读区方括号中没有列出的字符。
--------+---------------+---------------------------------------------------------- %|None|读取%字符,且不执行任何赋值操作。
___________________________________________________________________________________
表 2精度限定符
___________________________________________________________________________________ 精度限定符|含义
----------------+------------------------------------------------------------------ hh|用于类型说明符d、i、o、u、x、X或n前面时,指定参数是指向signed char |或unsigned char的指针。
----------------+------------------------------------------------------------------ h|用于类型说明符d、i、o、u、x、X或n前面时,指定参数是指向short int |或unsigned short int的指针
----------------+------------------------------------------------------------------ l|用于类型说明符d、i、o、u、x、X或n前面时,指定参数是指向long或
|unsigned long的指针;用于类型说明符a、A、e、E、f、F、g或G前面时,
|指定参数是指向double的指针。
----------------+------------------------------------------------------------------ ll|用于类型说明符d、i、o、u、x、X或n前面时,指定参数是指向long long |或unsigned long long的指针。
----------------+------------------------------------------------------------------ L|用于类型说明符d、i、o、u、x、X或n前面时,指定参数是指向long double |的指针。
___________________________________________________________________________________
表 3printf()和fprintf()使用的转换字符
___________________________________________________________________________________ 转换字符|含义
----------------+------------------------------------------------------------------ d, I|以十进制方式显示有符号整数
----------------+------------------------------------------------------------------ u |以十进制方式显示无符号整数
----------------+------------------------------------------------------------------ o|以八进制方式显示无符号整数
----------------+------------------------------------------------------------------ x, X |以十六进制的方式显示无符号整数,x表示输出小写,X表示输出大写
----------------+------------------------------------------------------------------ c |显示一个字符(参数为该字符的ASCII码)
----------------+------------------------------------------------------------------ e, E |以科学计数法显示float或double值(例如123.45被显示为1.234500e+002)。
|如果没有使用f说明符指定精度,则显示6位小数。e和E用户控制输出的大小
|写。
----------------+------------------------------------------------------------------ f |以十进制计数法显示float或double值(例如,123.45被显示为123.450000)
|。如果没有指定精度,则显示6位小数。
----------------+------------------------------------------------------------------ g, G |使用e、E或f格式。如果指数小于-3或大于精度(默认为6),则使用E或e格式|。末尾多余的0将被截除。
----------------+------------------------------------------------------------------ n |不显示任何东西。与转换命令n对应的参数为int指针。printf()将当前输出|的字符数赋给该变量。
----------------+------------------------------------------------------------------ s |显示一个字符串。对应的参数为一个char指针。显示空字符之前的所有字符|或指定数目的字符。不显示末尾的空字符。
----------------+------------------------------------------------------------------ % |显示字符%。
___________________________________________________________________________________
> 关于转换命令:转换命令的组成如下,其中用方括号括起的是可选的:
%[flag][field_width][.[precision]][l]conversion_char
21天学通C语言
说明:
字段宽度限定符指定了输出的最小字符数,其内容如下:
· 不以0打头的整数。在输出左边添加空格,以满足指定的字段宽度。
· 以0打头的整数。在输出左边添加0,以满足指定的字段宽度。
· *字符。下一个参数(其类型必须为int)用于指定字段宽度。例如,如果w的类型为int,值为 10,则语句printf("%*d", w, a); 打印a的值,并使其字段宽度为10。
对于可选项标记flag,可能的4种值如下:
· -:输出是左对齐,而不是默认的右对齐;
· +:对于有符号数,在其左边加上+或-;
· '':在正数前面加上空格;
· #:只能用于转换字符x、X或o。表示对于非0数字,在前面加上0X、0x(对于x和X)或0(对于o) > 重定向输入/输出
* ------------------------------- *
* 第 15 天课程 有关指针的高级主题 *
* ------------------------------- *
> 声明指向指针的指针
int myVar = 12;
int *ptr = &myVar;
int **ptr_to_ptr = &ptr;
> 看待多维数组的方式
例如:int multi[2][4]; 可以将multi看作是一个包含两个元素的数组,而其中每个元素都是一个包含4个int变量的数组。
> 要声明一个名为ptr,且能够指向multi的元素的指针变量,可以这样做:
int (*ptr)[4];
> 声明指向函数的指针
type (* ptr_to_func)(parameter_list);
> 声明函数指针数组
type (* ptr_to_func[nbr])(parameter_list);
> 在实际的程序中,一定要检查内存分配函数的返回值以确保成功的分配了内存。
> 内存泄露
* ------------------------- *
* 第 16 天课程 使用磁盘文件 *
* ------------------------- *
> fputs() 函数不会在字符串末尾加上换行符。
> functions:
FILE *fopen(const char *filename, const char *mode);
int fprintf(FILE *fp, char *fmt, ...);
int scanf(FILE *fp, char *fmt, ...);
int fwrite(void *buf, int size, int count, FILE *fp);
int fread(void *buf, int size, int count, FILE *fp);
不要假设存取文件是成功的。读、写、打开文件时,一定要进行检查,以确保函数以成功地执行。
> 文件缓冲技术:关闭和刷新文件
int fclose(FILE *fp);int fcloseall(void);
int fflush(FILE *fp);int flushall(void);
> 顺序文件存取和随机文件存取
long ftell(FILE *fp);void rewind(FILE *fp);int fseek(FILE *fp, long offset, int
origin);
表 1fseek()中的origin参数的可能取值
____________________________________________________________________________________常量|值|描述
----------------+---------------+---------------------------------------------------SEEK_SET|0|将指示器移到离文件开头offset字节的位置
----------------+---------------+---------------------------------------------------SEEK_CUR|1|将指示器移到离当前位置offset字节的位置
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
C语言文件操作函数大全(超详细)讲解
« 上一篇
中山大学计算机组成原理实验-bomblab
下一篇 »
发表评论