C Primer Plus 第四章 字符串和格式化输入输出
第四章主要内容:用char类型的数组存放字符串,常量的定义,printf和scanf的用法
第四章不理解的内容:参数传递,导致转换不匹配的原因,明示常量
第四章的一些知识点:
1.#include<string.h>提供strlen函数的原型
2.strlen()函数可以获取字符串的长度(letter=strlen(name)令letter等于字符串name的长度)(与sizeof函数的区别详参此网址和此网址,我现在还看不太懂)
3.根据%s转换说明,scanf函数只读取字符串中的一个单词,遇到空格就不继续读取了
4.strlen函数不计字符串最后的空字符,但是会计算字符串中的空格和标点符号
5.常量的定义格式:#define NAME value(不加等号,最后也不加分号,用大写表示符号常量是c语言的习惯)
6.#define还可以定义字符常量和字符串常量,前者用单引号,后者用双引号
7.const关键字用于限定一个变量为只读,用法:const int MONTHS=12
8.由于printf函数使用%符号来标识转换说明,因此打印%符号就要用两个%号
9.“%5.2”表示打印一个浮点数,字段宽度为5,保留2位小数点
10.%hu、%hx
11.12.
13.
14.实际上,转换说明是翻译说明,%d的意思是“把给定的值翻译成十进制整数文本打印出来”
15.在字符串中,可以使用\n来表示换行字符,但是不能通过按回车键产生实际的换行符(在printf的代码的双引号中回车会被识别为非法字符,\加回车在代码页面能换行,在运行的时候并不会换行)
16.用scanf()读取基本变量类型的值,在变量名前要加&;
而字符串放入字符数组中,不要使用&。
17.scanf语句中“%*d”的星号表示读取时跳过这一个(在程序需要读取文件中特定列的内容时,这项跳过功能很有用)
18.如果想把数据打印成列,指定固定的字段宽度非常有用
第四章复习题:
1.会在输出时只输出名字中的前一个单词,因为scanf函数根据%s转换说明,它读到空白字符(空格)就会结束。//事情没有这么简单,程序应该不能正产运行,因为scanf函数没有把姓(字符串中后面的单词)读进去,下一条scanf语句在读取的时候就从“姓”开始读,而且把“姓”这个字符串当成浮点型“体重”来读,进而导致读取失败
2.
a.打印:He sold the painting for $235.00 .// $234.50
b.打印:Hi\41 //Hi!因为\41是八进制字符常量的ASCII表示(41是八进制,转换成十进制是33,33对应的ASCII码是“!”)
c.打印:
His
has 42 characters.//错啦,定义常量里面定义的字符串全都能读
d.打印:Is 1.2e3 the same as 1200.00? //应该是Is 1.02e+003 the same as 1201.00?
3.在双引号前面加反斜杠
4.booboo要加双引号;main前面要加int,main后面的括号里是void;第二条printf语句name的转换符应该是%s;第二条scanf语句age的转换符应该是%d;变量xp没有定义//还要加头文件#include<stdio.h>,define前面要加#,第二条scanf语句age前面要加&,return打错
5.
#include<stdio.h>
#define BOOK "War and Peace"
int main(void)
{
float cost=12.99;
float percent=80.0;
printf("This copy of \"%s\" sells for $%f.\n",BOOK,cost);
printf("That is %.0f%% of list.",percent);
return 0;
}
6.7.8//抄个答案吧
a.一个字段宽度与尾数相同的十进制数
b.一个形如8A、字段宽度为4的十六进制数
c.一个形如232.346、字段宽度为10的浮点数
d.一个形如2.33e+002、字段宽度为12的浮点数
e.一个字段宽度为30、左对齐的字符串
//答案都懒得抄了
9.//差不都懂了,不写先
10.空白就是\0//也不能完全这么说,空白包括空格、制表符、换行符
11.没看出来问题//%z中的z是修饰符,不是转换字符,所以要在修饰符后面加上一个它修饰的转换字符。可以使用%zd打印十进制数,或者用其他的
第四章编程练习:
1.
#include<stdio.h>
int main(void)
{
char familyname[40];
char name[40];
printf("请输入您的姓:");
scanf("%s",familyname);
printf("请输入您的名:");
scanf("%s",name);
printf("%s%s,您好",familyname,name);
return 0;
}
#include<stdio.h>
#include<string.h>
int main(void)
{
char name[40];
printf("请输入您的名字:");
scanf("%s",name);
printf("\"%s\"\n",name);
printf("\"%20.*s\"\n",strlen(name),name);
printf("\"%-20.*s\"\n",strlen(name),name);
printf("\"% *.*s\"\n",strlen(name)+3,strlen(name),name);
return 0;
}
#include<stdio.h>
int main(void)
{
double a;//不知道为什么定义成float整型的话,输入21.3,会输出21.299999
scanf("%lf",&a);//不知道为什么用c free 5.0的话double的转换字符要用%lf
printf("%lf %e",a,a);
return 0;
}
#include<stdio.h>
int main(void)
{
float height;
char name[40];
scanf("%f",&height);
scanf("%s",name);
printf("%s,你的身高为%.2f米",name,height*0.01);
return 0;
}
#include<stdio.h>
int main(void)
{
float velocity,size,time;
scanf("%f %f",&velocity,&size);
printf("在%.2fMb/s的速度下,下载一个%.2fMB的文件需要%.2f秒\n",velocity,size,(size*8)/velocity);
return 0;
}
#include<stdio.h>
#include<string.h>
int main(void)
{
char familyname[40];
char name[40];
scanf("%s",familyname);
scanf("%s",name);
printf("%s %s\n",name,familyname);
printf("%*.d ",strlen(name),strlen(name));
printf("%*.d\n",strlen(familyname),strlen(familyname));
return 0;
}
#include<stdio.h>
#include<string.h>
int main(void)
{
char familyname[40];
char name[40];
scanf("%s",familyname);
scanf("%s",name);
printf("%s %s\n",name,familyname);
printf("%-*.d ",strlen(name),strlen(name));
printf("%-*.d\n",strlen(familyname),strlen(familyname));
return 0;
}
7.???
8.空着先