C语言 学习记录2 第四章 字符串的格式化输入输出

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.空着先

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值