第4章 字符串与格式化输入/输出

本章主要讲了常量和变量和他们的输入、输出,与上一章的关联度较高。

字符串及其相关函数

本书首先引入了一个又老又新的概念“字符串”。它已经在本书前面部分多次出现,在这里有了详细的介绍。
字符串是被双引号给包起来的内容。我们常常把它储存在字符数组之中。数组是一组连续的相同的数据类型的排列,字符数组把字符串内容一个字符一个字符地储存起来。注意,字符串的末尾往往带着一个\0,既代表着字符串的结束,同时也凭此与纯粹的字符区别开来。
测量字符串相关的长度大小涉及到函数strlen()以及运算符sizeof
strlen()函数测量字符串里有几个字符(不包括末尾的\0)
sizeof运算符在上一章已经提到过,只不过上一章是用来测量数据类型的大小。这一章里,我们发现sizeof的作用不仅局限于此,它还能测量特定量的大小,而且此时不用加括号(当然最好加上,以养成统一的编程习惯)。
sizeof返回字符串的大小包括末尾的\0,返回字符数组的大小与之前设定的一致。

char box[40]="艳阳天那个风光好,红的花是绿的草";
printf("%zd",sizeof(box));

如本例,打印出来的是40,即40个字节。

常量与变量

常量预先设定,往往是不会变动的。而变量则在程序运行过程中被赋值和修改。
常量分为数值常量、符号常量(明示常量)。数值常量如3.14。符号常量用一些单词代替数据,会把程序中的相关内容自动替换掉
在C预处理指令用#define声明的常量是明示常量:

#define PI 3.14//这行语句将把程序中所有的 PI 自动替换成 3.14。

与之相类似的一种方式是使用const限定符,限定一个变量为只读:

const int MONTHS = 12; //MONTHS在程序中不可更改,值为12

使用这种方式可以大大提高程序的可读性

格式化输入/输出

接下来是printf()和scanf(),它们一个输入,一个输出。在前面的章节里已经有了粗浅的介绍,接下来进行一些补充。

printf()
转换声明修饰

修饰符 含义说明
标记 详情见下一张表
数字 最小字段宽度
.数字 %e、%E、%f:保留小数点后面第几位
%g、%G:有效数字最大位
%s:字符的最大数量
整型:最小位

标记

标记 含义说明
- 从字段最左边开始打印
+ 表示正负号
空格 表示正负,正的空格,负的-覆盖空格
0 用0填充前面的空格(如果出现-标记或指定精度则忽略该标记)

转换说明起到一个翻译的作用。同一个数值,用不同的转换说明会有不同的效果。

#include <stdio.h>
#define NUM 333
int main(void)
{   
    printf("num as int and char:%d %c\n",NUM,NUM);
    printf("-num as short and unsigned short:%hd %hu\n",-NUM,-NUM);
    return 0;
}

输出→
num as int and char:333 M
-num as short and unsigned short:-333 65203
一行一行解释(只解释每行的第二个)。
第一行,转换说明%c表明输出一个字符,然而ASCII编码只有0-255,这个333显然远远超出了。但是这不重要,因为printf()只会查看后8位,也就是0~255。这在数学上相当于对原来的数除以256后取余(以256为模)。
第二行,一个负数被被要求表达成一个非负数,结果输出了65203。这是short int在参考系统的表示方式所致,它本身有两个字节,第一个字节(0-32767)表示正数,第二个字节(32768-65535)表示负数。被解释成无符号数时,-1对应最大的,-2对应倒数第二大的,以此类推。-333 → 65536-333=65203
这启示我们不能乱用转换说明。然而,有时即使用对了转换说明,也会出现问题,看接下来的代码:
敲黑板,马上就到printf()的参数传递原理,这里我认为是本章的重点。

#include <stdio.h>
int main(void)
{   
    float a=3.2;
    double b=2.0;
    long c1 =3000000000;
    long c2 =2340000000;
    printf("%ld,%ld,%ld,%ld",a,b,c1,c2);
    return 0;
}

输出→
-1610612736,0,-1294967296,-1954967296
奇怪了,c1、c2命名用对了转换说明,为什么输出的值还是错的呢?
原来,printf()在进行打印之前,先把参数列表中的数据储存在栈里,然后再一个个读取,输出到屏幕上。float类型a变量在储存到栈的过程中自动转换为double,由4字节变为8字节,b变量本身也是8字节。而%ld转换说明告诉计算机应该读4个字节。第一个读a前半部分;第二个读a后半部分;第三个读b前半部分;第四个读b后半部分。其结果就是用了4个%d后仍然没有到达c1、c2对应的栈的储存地点,也就自然无法输出c1、c2。

scanf()
键盘输入的都是字符,转换说明将字符翻译成相应的数据类型。
转换说明大部分和printf()一样。讲几个不一样的。
%e、%E、%g、%G这些一律看成float类型,对于double要加 l 修饰符
读取过程:跳过前面的空白字符(除char类型)一个一个保存数据并读下去,直到遇到与要求的数据类型不同的数据(包括空白),并将其放回输入。
ps:如果转换类型是%c,输入的第一个字符是空白,那么储存的就是空格。如果想要跳过空白,可以在格式字符串中%c的前面加入空格。

printf()和scanf()的 * 修饰符
*在printf()和scanf()中的用法并不相同,先介绍printf()
在printf()中,*用于延缓输出,也就是用于代替修饰符中的数字,这样输出的标准就可以在程序之中被指定了。

#include <stdio.h>
#define PERCENT 1
int main(void)
{
    float a;
    a=723.88;   
    printf("%.*f",PERCENT,a);
    return 0;
}

输出→ 723.9
而在scanf()中,*放在%和转换说明之间,会使得scanf()跳过相应的输入项

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容