C Primer Plus 第四章——字符串和格式化输入/输出

C没有为字符串定义专门的变量类型,而是把它存储在char数组中。数组的最后一个位置显示字符\0,即空字符(null character),C用它来标记字符串的结束。空字符不是数字0;它是非打印字符,其ASCII码的值为0。该字符的存在意味着数组的单元数必须至少要比存储的字符数多1。用%s来打印一个字符串。

scanf()开始读取输入以后,会在遇到的第一个空白字符空格(blank)、制表符(tab)或者换行符(new line)处停止读取。使用%s的scanf()只会把一个单词而不是整个语句作为字符串读入。C使用其他读取输入函数 (如gets())来处理一般的字符串。

'x':一个字符常量,属于基本类型。

"x":一个字符串常量,属于派生类型。"x"实际上有两个字符('x'和'\0')。

strlen()函数以字符为单位给出字符串的长度。在string.h头文件中定义。

sizeof()中圆括号对于类型是必须的,而对于具体量则是可选的。

#define NAME value  利用预处理器定义常量(宏定义)。编译时值value将会在NAME出现的每个地方替代它(宏替换)。#define语句也可以用于定义字符和字符串常量,前者用单引号,后者用双引号。

C90新增了创建符号常量的第二种方法,即使用const关键字把一个变量声明转换成常量声明。

头文件limits.h和float.h分别提供有关整数类型和浮点类型的大小限制的详细信息。在这些文件中定义了如INT_MAX 和FLT_MIN 这样的符号常量。

printf()的使用格式:

printf( Control-string, item1, item2,... );           控制字符串+参数列表

printf()函数使用转换说明符来根据不同变量类型打印变量。


通过在%和定义转换字符之间插入修饰符对基本的转换说明加以修改。



应该使转换说明与要打印的值的类型相匹配。由于不同类型值的存储方式、存储空间大小等都不相同,如果采用了不匹配的转换将会导致错误。

printf()函数的返回值:所打印的字符的数目,包括空格和不可见的字符。要分割printf()引号中括起来的字符串,可以用反斜杠\加回车,或者用两个用双引号引起来的字符串,中间用空白字符分割(ANSI C的新方法)。或者干脆在两行使用两个printf()如:

printf("Here's one way to print a \
long string.\n"); //使用反斜杠+回车
printf("Here's the newest way to print a "
"long string.\n"); //ANSI C的新方法
scanf()是printf()的逆操作,用来读取各种格式的数据。和printf()一样,它使用控制字符串和参数列表。控制字符串指出输入将被转换成的格式。主要的区别在参数列表中。printf()使用变量名、常量和 表达式;而scanf()函数使用指向变量的指针。

scanf()函数使用空格(换行、制表符和空格)来决定怎样把输入分成几个字段。scanf()函数所用的转换说明符与printf()几乎相同,主要的区别在printf()把%f、%e、%E、%g和%G同时用于float类型和double类型,而scanf()只把它们用于float类型,而用于double类型时要求使用l修饰符。


从scanf()的角度看输入:

假定使用一个%d说明符来读取一个整数,scanf()函数开始每次读取一个输入字符,跳过空白字符(空格、制表符和换行符)直到遇到一个非空白字符。如果它发现了一个数字或一个符号,那么它就保存之并读取下一个字符;如果接下来的字符是一个数字,它保存这个数字,并读取下一个字符。就这样,scnaf()持续读取和保存字符直到它遇到一个非数字的字符。如果遇到了一个非数字的字符,它就得出结论:已读到了整数的尾部。scanf()把这个非数字字符放回输入。当程序下一次读取输入时,它将从前面被放弃的那个非数字字符开始。最后,scanf()计算读取到的数字的相应数值,并将该值放到指定的变量中。

如果第一个非空白字符不是数字,将会发生什么呢?比如,是A而非一个数字?这时scanf会停在那里,并把A(或者不管是什么)放回输入。没有任何值赋给指定的变量,程序下一次读取输入时就在A处重新开始。如果程序中只有%d说明符,scanf()永远也不会越过那个A。

使用其他数字说明符读取输入与使用%d情况相同,主要区别在于scanf()也许会将更多字符看作数字的一部分,如%x要求scanf识别十六进制数字a~f和A~F。 如果使用%s说明符,那么空白字符以外的所有字符都是可以接受的,所以scanf()跳过空白字符直到第一个非空白字符,然后保存再次遇到的空白字符之前的所有非空白字符。当scanf()把字符串 放在一个指定的数组时,它添加'\0'使得数组内容成为一个字符串。如果使用%c说明符,则所有输入字符都是平等的,不会跳过空白字符。

scanf()函数允许把普通字符放在格式字符串中。除了空格字符之外的普通字符一定要与输入字符串准确匹配。

scanf()的返回值:成功读入的项目的个数。如果它没有读取任何项目,则会返回0。当它检测到文件结尾时返回EOF(在stdio.h中定义的特殊值,一般为-1)。

printf()和scanf()的*修饰符: 

printf()中可以用来控制输出格式,参数列表中需要添加一个*的值。

scanf()中可以使函数跳过相应的输入项目。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值