《C Primer Plus》学习笔记——字符串和格式化输入/输出

1、char数组类型和空字符

空字符:\0

用%s打印一个字符串

 

2、strlen和sizeof

strlen计算的是字符串的长度,sizeof计算的是变量使用的内存大小,不受里面存储的内容改变。strlen不包括’\0’。

  sizeof(...)是运算符,在头文件中typedefunsigned 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 }

 

posted @ 2014-04-17 16:32  cxyfreedom  阅读(672)  评论(0编辑  收藏  举报