C Primer Plus (第五版)中文版——第 4 章 字符串和格式化输入输出

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;
}

猜你喜欢

转载自blog.csdn.net/Mr__Gold/article/details/83688207