C语言《CPrimerPlus》学习总结--第四章-创新互联

第四章 字符串和格式化输入/输出
  • 字符串简介
    • 1.字符串定义
    • 2.字符数组
    • 3.sizeof() 和 strlen()
  • 常量和C预处理器
  • printf()函数
  • scanf()函数

创新互联是一家集网站建设,临沧企业网站建设,临沧品牌网站建设,网站定制,临沧网站建设报价,网络营销,网络优化,临沧网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。字符串简介 1.字符串定义

C语言中没有专门用于储存字符串的变量类型,字符串都被储存在char类型的数组中,数组是由连续的存储单元组成,字符串的字符储存在相邻的存储单元中,每个单元存储一个字符。
图片来源于C Primer Plus
在数组末尾的字符\0,在C语言中字符串一定以空字符结束,这就意味着数组的容量必须至少比带存储字符串的字符数多1位用来存放空字符。
字符串和字符的区别:单引号用于字符,双引号用于字符串。例如:字符串“x”和‘x’的区别如下:
图片来源于C Primer Plus

2.字符数组

数组是同种类型数据元素的有序序列。

char name[5];//创建一个大小为5的char类型的数组
int arr[10];//同样可以创建int类型的数组,arr数组有10个int型变量或常量。

图片来源于C Primer Plus

3.sizeof() 和 strlen()

strlen()函数可以计算出字符串中字符长度,使用strlen()函数需包含头文件。

#include#includeint main(void)
{char name[40];//创建字符串数组。
	printf("what's your name?");
	scanf("%s",name);
	printf("hello,%s\n",name);
	printf("Your name of %zd letters occupies %zd memory cells.\n",strlen(name),sizeof name);
	return 0;
}
输出的结果为:
what's your name? john bill
hello,join
Your name of 4letters occupies 40 memory cells.

sizeof计算得出数组的大小,strlen()计算出当前字符串的长度,不包括\0在内。
图片来源于C Primer Plus
sizeof 和 strlen()的区别
(1)sizeof使一个操作符,strlen()是库函数,sizeof任意使用,而strlen()使用前需包括头文件。
(2)sizeof的参数可以是数据的类型,也可以是变量,而strlen()只能以结尾为‘\0’的字符串作为参数。
(3)编译器在编译时计算出sizeof的结果,而strlen函数必须在程序运行时才能计算出来。sizeof计算的是数据类型占内存的大小,而strlen()计算的是字符串实际的长度。
(4)sizeof的参数为数据类型名是必须加括号,参数若为变量名括号可以省略。

常量和C预处理器

在C语言程序中,程序动辄几百行,当存在一个常量时,如果用数字的形式来频繁的使用的话,代码的可读性很差,且如果这个常量需要改变的话,需要逐一修改很麻烦。所以为了代码的可读性,C语言提供了预处理器的方法。

//格式
#define NAME value
#define PI 3.1415926
circumference = PI * diameter;
areas = PI * Pi * radius;

代码在编译时,所有的PI都将被替换成3.1415926,在程序运行阶段,程序中所有的替换均已完成。
另一种方式是使用const限定符,const使一个关键字,用于限定一个变量为只读。

const int MONTHS = 12;//MONTHS在程序中不可更改,值为12

这使得MONTHS成为一个只读值,可以使用,但是不可更改其值,const 还可用来修饰函数指针等,后续会详细介绍。
const 和 #define的区别如下:
#define在编译的预处理阶段起作用,只是进行字符串的替换,并没有类型检查等操作,在程序运行时,程序每使用一次#define定义的值就会开辟一块内存,容易浪费内存。程序中使用#define可以使程序简单明了,通俗易懂。并且代码的维护相对容易,在修改定义的值时只需修改定义处即可。
const常量有数据类型,在运行时会对其进行类型安全检查,const定义的只读变量在程序运行过程中只备份一次,比较节省空间。

printf()函数

在使用printf()函数打印数据时指令要和待打印的类型相匹配,例如在打印整形数据时,不能使用字符的转换字符,C语言有标准的转换说明要求,如下表所示:
图片来源于C Primer Plus

int a = 10;
float b = 3.14;
float c = 1.11;
printf("The value of a is %d,and The value of b is %f",a,b);//使用正确的转换说明来读取对应的数据类型。
printf("The value of b is %f,The value of c is %f",b);//在使用函数时,转换说明要和后者数据相匹配,是成对出现,这是错误的示例。

如果想更加细节的打印,可在%和转换字符之间插入修饰符可修饰基本的的转换说明。具体如下表所示:
图片来源C Primer Plus
举例说明:

#includeint main(void)
{float PI = 3.1415926;
    printf("%2f",PI);//字符宽度设为2,原数据大于给定宽度,会自动扩展到该有宽度。
    printf("%10f",PI);//指定字符宽度为10,空余部分用空格补齐
    printf("%.2f",PI);//设置精度,保留小数后两位有效数字
	return 0;
}

转换字符是将字符串转换成程序员所需要的数据类型,比如数字76在计算机中存储格式是二进制01001100,%d,将其转换成字符7和6,显示为76。%x将其转换为十六进制0x4c。所以转换字符的存在就是为了满足程序员所需要不同类型的数据格式。

scanf()函数

scanf()和printf()类似,也是用格式字符串和参数列表。两个函数主要区别在参数列表,printf()函数使用变量、常量和表达式,而scanf()函数使用只指向变量的指针。这里有两条规则:
如果scanf()读取基本变量类型的值,在变量名前加&;
如果scanf()把字符串读入字符数组中,不需要使用&。

#include//包含头文件必不可少
int main(void)
{int age;//创建变量
	char name[30];
	printf("how old are you?");
	scanf("%d",&age);
	printf("what's your name?");
	scanf("%s",name);//这里不适用&
	printf("My name is %s,I am %d years old",name,age);
	return 0;
}

对于scanf()函数中的转换说明具体含义如下表所示:
图片来源C Primer Plus
scanf()和printf()函数在对于转换说明的使用大体相同,主要区别在于,对于float类型和double类型,printf()使用%f、%e、%E、%g和%G转换说明,而scanf()只把他们用于float类型,对于豆瓣了
类型使用l修饰符。具体标准如下:
图片来源C Primer Plus
更新于2022.12.24

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享文章:C语言《CPrimerPlus》学习总结--第四章-创新互联
地址分享:http://scjbc.cn/article/cephoe.html

其他资讯