4.1 前导程序
#include <stdio.h>
#include <string.h> /*提供strlen() 函数原型*/
#define PRAISE "You are my sunshine!!!"
int main(void)
{
char name[20]; /*name是一个有20个字符的数组,用于保存名字*/
int age; /*年龄*/
int letters; /*名字字符数*/
printf("Hi! What\'s your name?\n");
scanf_s("%s", name, 20); /*用户输入名字*/
printf("Well, %s, How old are you?\n",name);
scanf_s("%d", &age); /*用户输入年龄*/
letters = strlen(name); /*名字长度*/
printf("%s,you are %d years old and your name have %d letters.\n", name, age, letters);
printf("%s, %s\n", name, PRAISE);
return 0;
}
该程序主要的新特性如下:
- 使用一个数组(array)来存放一个字符串。该数组是内存中一串连续的20个字节,其中每个字节都可存放一个字符值
- 使用了 %s 转换说明符来处理字符串的输入和输出,且在 scanf_s() 中,age 使用了 & 前缀而 name没有使用
- 使用 C 函数 strlen() 函数来获取字符串的长度
4.2 字符串简介
字符串(character string)是一个或多个字符的序列。如:
"Hello, Mr.Gold!"
双引号不是字符串的一部分,它们只是通知编译器其中包含了一个字符串。
4.2.1 char 数组类型和空字符
C 将字符串存储在 char 数组中,字符串中的字符存放在相邻的存储单元中,每个字符占用一个单位,每个单元是1个字节;而数组由相邻存储单元组成。C 的字符串存储时通常以空字符 \0 结束,因此数组的单元数至少要比存储的字符数多1。
char name[20];
name 后面的方括号说明它是一个数组,方括号内的数字20指出数组中元素的数目,char 标识每个元素的类型。
4.2.2 使用字符串
printf("%s, %s\n", name, PRAISE);
%s 告诉 printf() 函数要打印一个字符串,%s 出现两次是因为该程序要打印两个字符串:一个被存储在 name 数组中,另一个由PRAISE 来代表。
scanf_s("%s", name, 20); /*用户输入名字*/
scanf_s() 开始读取输入以后,会在遇到的第一个空白字符(空格、制表符或换行)处停止读取。
4.2.3 strlen() 函数
letters = strlen(name); /*名字长度*/
strlen() 函数以字符为单位给出字符串的长度。
4.3 常量和 C 预处理器
①预处理器允许定义常量:
#define PI 3.14 /*PI 只是3.1415926的别名,在编译期间用3.1415926去取代PI的值*/
4.3.1 const 修饰符
②使用 const 关键字把一个变量声明转换成常量声明:
const int MONTH = 12; /*将 MONTH 定义成变量,但告诉编译器它的值是固定不变的。若在程序中试图去修改其值,编译时会报错*/
③枚举功能定义符号常量:
enum Sex{MALE,FEMALE} /*枚举常量,值是从0开始递增,即 MALE=0,FEMALE=1*/
4.3.2 系统定义的明显常量
C 头文件 limits.h 和 float.h 分别提供有关整数类型和浮点类型的大小限制的详细信息。每个文件定义了一系列明显常量。
4.4 研究和利用 printf() 和 scanf()
printf() 和 scanf() 能够实现用户与程序的交互。它们被称为 I/O 函数。
4.4.1 printf() 函数
请求 printf() 打印变量的指令取决于变量的类型。转换说明符指定了如何把数据转换成可显示的形式。
4.4.2 使用 printf()
printf() 的使用格式:
printf(Control-string, item1, item2, ...);
控制字符串(Control-string)是一个描述项目如何打印的字符串。包含两种形式的信息:
- 实际要打印的字符
- 转换说明
参数列表(item)使用变量名、常量和表达式。
printf() 的返回值是它所打印的字符的数目。
4.4.3 printf() 的转换说明修饰符
4.4.5 使用 scanf()
scanf() 函数可以读取各种格式的数据。同 printf() 一样,scanf() 使用字符串和参数列表。控制字符串指出输入将被转换成的格式,参数列表使用指向变量的指针。scanf() 函数使用空白字符(空格、制表符或换行)来决定怎样把输入分成几个字段,它依次把转换说明符与字段匹配,并跳过它们之间的空白字符。唯一的例外是 %c,即使下一字符是空白字符,它也会读取那个字符。
本文表格引自:http://www.cnblogs.com/ilegend/archive/2011/11/22/2258701.html
scanf() 的返回值是它所成功读入的项目的个数。
4.4.6 printf() 和 scanf() 的 * 修饰符
printf() 的 * 修饰符:假定您不想事先指定字段宽度,而是希望由程序来指定该值,那么您可以在字段宽度部分使用 * 代替数字来达到目的,同时您也必须使用一个参数来告诉程序字段宽度应该是什么。例如:
#include <stdio.h>
int main(void)
{
unsigned width, precision; /*声明字段宽度、精度*/
double weight = 139.5;
scanf_s("%d %d", &width, &precision); /*指定字段宽度、精度*/
printf("weight = %*.*f\n", width, precision, weight);
return 0;
}
scanf() 的 * 修饰符:将 * 放在 % 和说明符字母之间时,它使函数跳过相应的输入项目。例如:
#include <stdio.h>
int main(void)
{
int num;
scanf_s("%*d %*d %d", &num); /*跳过两个整数,并把第三个整数赋给 num*/
printf("num = %d\n", num);
return 0;
}