《C Primer Plus》学习笔记——字符串和格式化输入/输出
1、char数组类型和空字符
空字符:\0
用%s打印一个字符串
2、strlen和sizeof
strlen计算的是字符串的长度,sizeof计算的是变量使用的内存大小,不受里面存储的内容改变。strlen不包括’\0’。
sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
它的功能是:保证能容纳实现所建立的最大对象的字节大小。
由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
数组——编译时分配的数组空间大小;
指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。
strlen(...)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。
具体内容参考XXX一文。(待写)
3、明显常量定义格式
#define NAME value
4、printf()的使用格式
printf(Control-string, item1, item2, ...)
控制字符串就是双引号内的语句
"-"修饰符使文本左对齐输出
5、scanf()的返回值
scanf()函数返回成功读入的项目的个数。如果没有读取任何项目,返回值0;检测到文件结尾,返回EOF(一般EOF的值定为-1)。
6、printf()和scanf()的*修饰符
在printf()中,可以在字段宽度部分使用*代替数字,但也必须使用一个参数。
在scanf()中,它使函数跳过相应的输入项目。
空白字符:制表符、空格和换行符
catch22(但是跳过catch)
1 int b; 2 scanf("%*[^0-9]%d",&b);
7、编程练习
1、编写一个程序,要求输入名字和姓氏,然后以“名字,姓氏”的格式打印。
1 #include<stdio.h> 2 3 int main(void) 4 { 5 char surname[20],firstname[20]; 6 printf("Please input your firstname and surname:"); 7 scanf("%s",firstname); 8 scanf("%s",surname); 9 printf("You are %s,%s.\n",firstname,surname); 10 return(0); 11 }
2、编写一个程序,要求输入名字,并执行以下操作:
a.把名字引在双引号中打印出来。
b.在宽度为20个字符的字段内打印名字,并且整个字段引在引号内。
c. 在宽度为20个字符的字段的左端打印名字,并且整个字段引在引号内。
d.在比名字宽3个字符的字段内打印它。
1 #include<stdio.h> 2 #include<string.h> 3 4 int main(void) 5 { 6 char name[20]; 7 int width; 8 printf("Please input your name:"); 9 scanf("%s",name); 10 printf("A:\"%s\"\n",name); 11 printf("B:\"%20s\"\n",name); 12 printf("C:\"%-20s\"\n",name); 13 width=strlen(name)+3; 14 printf("D:\"%*s\"\n",width,name);//*对应width 15 return(0); 16 }
3、编写一个程序,读取一个浮点数,并且首先以小数点记数法,然后以指数记数法打印之。输出使用下列形式(在指数位置显示的数字的位数可能会随系统而不同):
a. The input is 21.3 or 2.1e+001.
b. The input is +21.290 or 2.129E+001.
1 #include<stdio.h> 2 3 int main(void) 4 { 5 float a; 6 printf("Please input a float:"); 7 scanf("%f",&a); 8 printf("a.The input is %.1f or %.1e\n",a,a); 9 printf("b.The input is %+.3f or %.3E\n",a,a); 10 return(0); 11 }
4、编写—个程序,要求输入身高(以英寸为单位)和名字,然后以如下形式显示:
Dabney, you are 6.208 feet tall
使用float类型,使用/作为除号。如果您愿意,可以要求以厘米为单位输入身高,并以米为单位进行显示。
1 #include<stdio.h> 2 3 int main(void) 4 { 5 float height; 6 char name[20]; 7 printf("Please input your height by inches:"); 8 scanf("%f",&height); 9 printf("Please input your name:"); 10 scanf("%s",name); 11 printf("%s,you are %f feet tall\n",name,height/12); 12 return(0); 13 }
5、编写一个程序,首先要求用户输入名字,然后要求用户输入姓氏。在一行打印输入的姓名,在下行打印每个名字中字母的个数。把字母个数与相应名字的结尾对齐,如下所示:
Melissa Honeybee
7 8
然后打印相同的信息,但是字母个数与相应单词的开始对齐。
1 #include<stdio.h> 2 #include<string.h> 3 4 int main(void) 5 { 6 char surname[20],firstname[20]; 7 printf("Please input your firstname and surname:"); 8 scanf("%s",firstname); 9 scanf("%s",surname); 10 printf("%s %s\n",firstname,surname); 11 printf("%*d %*d\n",strlen(firstname),strlen(firstname),strlen(surname),strlen(surname));//*对应宽度变量 12 return(0); 13 }
6、编写一个程序,设置一个值为1.0/3.0的double类型变量和一个值为1.0/3.0的float类型变量。每个变量的值显示三次:一次在小数点右侧显示4个数字,一次在小数点右侧显示12个数字,另一次在小数点右侧显示16个数字。同时要让程序包括float.h文件,并显示FLT_DIG和DBL_DIG的值。1.0/3.0的显示值与这些值一致吗?
1 #include<stdio.h> 2 #include<float.h> 3 4 int main(void) 5 { 6 double a=1.0/3.0; 7 float b=1.0/3.0; 8 printf("double a=1.0/3.0:\n"); 9 printf("%.4e\n",a); 10 printf("%.12e\n",a); 11 printf("%.16e\n\n",a); 12 printf("float b=1.0/3.0:\n"); 13 printf("%.4f\n",b); 14 printf("%.12f\n",b); 15 printf("%.16f\n\n",b); 16 printf("FLT_DIG:%d\n",FLT_DIG); 17 printf("DBL_DIG:%d\n",DBL_DIG); 18 return(0); 19 }
7、编写一个程序,要求用户输入行驶的英里数和消耗汽油的加仑数。接着应该计算和显示消耗每加仑汽油行驶的英里数,显示方式是在小数点右侧显示一个数字。然后,根据l加仑约等于3.785升,1英里约等于1.609公里的规则,它应该把每加仑英里数转换成每100公里的升数(欧洲通用的燃料消耗表示法),并显示结果,显示方式是在小数点右侧显示一个数字(请注意,美国方案测量每单位距离消耗的燃料数,而欧洲方案测量每单位燃料的行驶距离)。用符号常量表示两个转换系数(使用const或#define)。
1 #include<stdio.h> 2 #define GALLON 3.785 //1 gallon = 2.785 litre 3 #define MILE 1.609 //1 mile = 1.609 kilometer 4 5 int main(void) 6 { 7 float mile,gallon; 8 printf("Please input miles and gallons:"); 9 scanf("%f %f",&mile,&gallon); 10 printf("Miles per gallon:%.1f\n",mile/gallon); 11 printf("Litres per 100 kilometre:%.1f\n",gallon*GALLON/(100*mile*MILE)); 12 return(0); 13 }