表示字符串和字符串I/O在程序中定义字符串字符串字面量（字符串常量）用双引号括起来的内容称为字符串字面量，也叫作字符串常量。双引号中的字符和编译器自动加入末尾的\0字符，都作为字符串存储在内存中。从ANSI C标准起，如果字符串字面量之间没有间隔，或者用空白字符分割，C会将其视为串联起来的字符串字面量。字符串常量属于静态存储类别，这说明如果在函数中使用字符串常量，该字符串只会被存储一次，在整个程序的生命周期内存在，即使函数被调用多次。用双引号括起来的内容被视为指向该字符串存储位置的指针。这类似于把数组名作为指向数组位置的指针。字符串数组和初始化 定义字符串数组时，必须让编译器知道需要多少空间：一种方法是用足够空间的数组存储字符串。在指定数组大小时，要确保数组元素个数至少比字符串长度多1（为了容纳空字符）。所有未被使用的元素都被自动初始化为0（这里的0指的是char形式的空字符，不是数字字符0）。另一种方法就是让编译器确定数组大小，即前面讲过的省略数组初始化声明中的大小，编译器会自动计算数组大小。让编译器计算数组的大小只能用在初始化数组时。如果创建一个稍后再填充的数组，就必须在声明时指定大小。同数组，字符串的声明可以使用数组表示法和指针表示法。[...]
数组初始化数组只存储单个值的变量有时也称为标量变量，而存储多个值的数组，C使用新的语法来初始化数组，如下：int main(void) { int powers[8] = {1,2,4,6,8,16,32,64}; /* 从ANSI C开始支持这种初始化 */ }如上所示，用以逗号分隔的值列表（用花括号括起来）来初始化数组，各值之间用逗号分隔。在逗号和值之间可以使用空格。注意，通常的做法是用符号常量事先声明好数组的大小，以后修改数组大小只需要修改符号常量即可同普通变量一样，使用const声明和初始化数组可以把数组设为只读。同普通变量一样，在使用数组钱，必须先给他们初始化赋值，否则编译器使用的值是内存相应位置上现有的值，是不确定的。当初始化列表中的值少于数组元素个数时，编译器会把剩余的元素都初始化为0（注意，上面提到的是完全没有初始化，这里是初始化了部分）；当初始化列表中的值多于数组元素个数时，编译器会将其视为错误，其实，可以省略方括号中的数字，让编译器自动匹配数组大小和初始化列表中的项数。当使用sizeof对数组求值时（sizeof运算符给出它的运算对象的大小，以字节为单位），结果是整个数组的大小（以字节为单位），可以用sizeof对数组单个元素求值（以字节为单位），整个数组大小除以单个元素大小就是数组元素的个数。[...]
复习函数什么是函数：函数是完成特定任务的独立程序代码单元。为什么要使用函数：使用函数可以省去编写重复代码的苦差。即使程序只完成某项任务一次，也值得使用函数。因为函数让程序更加模块化，从而提高了程序代码的可读性，更方便后期修改、完善。使用函数要使用一个函数需要使用3次该函数标识符：函数原型告诉编译器函数的类型；函数调用表明执行函数；函数定义明确地指定了函数要做什么。函数参数定义带形式参数的函数 函数定义中的形式参数（形参）是局部变量，属该函数私有。声明带形式参数函数的原型 函数声明中形参写法与函数定义基本一致，但声明可以省略形参变量名只写变量类型。调用带实际参数的函数 在函数调用中，实际参数（实参）提供了形参的值。简而言之，形参是被调函数中的变量，实参是主调函数赋给被调函数的具体值。[...]
IO函数负责把信息传送到程序中。单字符I/O：getchar()和putchar()getchar()和putchar()每次只处理一个字符，这种方法很适合计算机。而且，这是大多数文本处理程序所用的核心方法。其实getchar()和putchar()都不是真正的函数，它们被定义为供预处理器使用的宏。缓冲区无缓冲和缓冲输入用户输入文本时回显用户输入的字符后立即重复打印该字符是属于无缓冲（直接）输入，即正在等待的程序可立即使用输入的字符；而在用户按下Enter键之前不会重复打印刚输入的字符，这种输入形式属于缓冲输入，用户输入的字符被收集并存储在一个被称为缓冲区的临时存储区，按下Enter键后，程序才可以使用用户输入的字符。为什么要有缓冲区？把若干字符作为一个块进行传输比逐个发送这些字符节约时间；如果用户打错字符，可以直接通过键盘修正错误，当按下Enter键时，传输的是正确输入。缓冲输入和无缓冲输入都有用武之地[...]