C Primer Plus reading notes(2012-3-14)

上一篇 / 下一篇  2012-03-15 22:44:37 / 个人分类:学习日志

第四章字符串和格式化输入输出
1.  scanf()在读取输入时会自动将空字符’\0’插入字符串末尾,而且当它遇到第一个空白字符空格(blank)、制表符(tab)或者换行符(newline)时会停止读取,因此使用%s的scnaf()只会把一个单词而不是把整个语句作为字符串读入,此时我们一般用gets()来处理一般的字符串。
2.  字符串常量”x”与字符常量’x’不同,’x’属于基本类型(char),而”x”则属于派生类型(char数组),另外,”x”实际上是由两个字符(’x’和空字符’\0’)组成的。
3.  strlen()是以字符为单位给出字符串的长度,其中空字符’\0’并不计算在内,而sizeof()是以字节为单位给出数据的大小,其中还包括空字符’\0’。
4.  定义符号常量的意义:a.提供更多的信息,增强代码的可读性;b.便于更改代码,特别对于在多处使用同一常量而又必须改变它的值时更为适用。可将符号常量名定义为大写字母,当遇到大写的符号名时,就可知道它是一个常量而变量了,比如:

#define PI 3.14159

 这里如果我们这样定义:

float pi = 3.14159;

 由于pi是个变量,程序可能意外地改变它的值,因此我们使用#define来定义它。除了以上方法之外,我们还可以使用const修饰符来创建符号常量,此时它就成为只读值,在计算中是不可改变的,比如:

const float pi = 3.14159;

5.  linits.h:整数限制头文件,float.h:浮点数限制头文件。例如:

#include <stdio.h>
#include <limits.h>
#include <float.h>
 
int main(void)
{
printf("Max int value on this system:%d\n",INT_MAX);
printf("Min int value on this system:%d\n",INT_MIN);
printf("Max float normal value on this system:%e\n",FLT_MAX);
printf("Min float normal value on this system:%e\n",FLT_MIN);
   return 0;
}

 输出结果:

Max int value on this system:2147483647
Min int value on this system:-2147483648
Max float normal value on this system:3.402823e+038
Min float normal value on this system:1.175494e-038

6.  不匹配的浮点转换实例:
n1在堆栈中占用8字节(float被转换成double),n2占用8字节,而n3和n4则分别占用4字节,prinft()在读取堆栈中的值时,它是根据转换说明符去读取的。%ld说明符指出,printf()应该读取4个字节,所以printf()在堆栈中读取前4个字节作为它的第一个值,即n1的前半部分,它被解释成一个长整数(long integer)。下一个%ld说明符再读取4字节,即n1的后半部分,它被解释成第二个长整数(long integer)。同样,%ld的第三、四个实例使得n2的前半部分和后半部分被读出,并被解释成两个长整数(long integer)。
7.  printf()返回所打印的字符的数目,如果输出错误,则返回一个负数(旧版本的printf会有不同的返回值),比如:

#include <stdio.h>
int main(void)
{
          int    test = 123;
          int    retvalue;
 
          retvalue = printf(“the test value is %d\n”,test);
          printf(“The printf() function printed %d characters.\n”,retvalue);
          return 0;
}

 输出结果:

the test value is 123
The printf() function printed 22 characters.

8.  在scanf()格式字符串的说明符中,除了%c以外,其它说明符均会自动跳过输入项之前的空格。比如:

#include <stdio.h>
int main(void)
 
{
          int a;
          printf("enter:\n");
          scanf("%d",&a);
          printf("%d.\n",a);
          return 0;
}

 输出结果:

enter:
 3
3.

 这里并没有输出空格。又比如:

#include <stdio.h>
int main(void)
 
{
          char a;
          printf("enter:\n");
          scanf("%c",&a);
          printf("%c.\n",a);
          return 0;
}

 输出结果:

enter:
 a
 .

 这里就是输出空格了。
9.  scanf()函数返回成功读入的项目的个数,如果它没有读取任何项目(当它期望一个数字而你又键入一个非数字字符串时就会发生这种情况),scnaf()会返回值0。当它检测到“文件结尾”时,它返回EOF(stdio.h中将EOF定义为值-1)。
10.printf()和scanf()的*修饰符:
 代码一:

//----使用可变宽度的输出字段----
#include <stdio.h>
int main(void)
{
   unsigned width, precision;
   int number = 256;
   double weight = 242.5;
 
   printf("What field width?\n");
   scanf("%d", &width);
   printf("The number is :%*d:\n", width, number);
   printf("Now enter a width and a precision:\n");
   scanf("%d %d", &width, &precision);
   printf("Weight = %*.*f\n", width, precision, weight);
   printf("Done!\n");
<


TAG:

 

评分:0

我来说两句

Open Toolbar