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

学习笔记——《C Primer Plus》

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

  • 4.1 前导程序
  • 4.2 字符串简介
    • 4.2.1 char 类型数组和 null 字符
    • 4.2.2 使用字符串
    • 4.2.3 strlen() 函数
  • 4.3 常量和 C 预处理器
    • 4.3.1 符号常量
      • 1. 使用**符号常量**的好处:
      • 2. 创建符号常量
    • 4.3.2 const 限定符
    • 4.3.3 转换说明的意义
  • 4.4 printf() 和 scanf()
    • 4.4.1 printf() 函数
    • 4.4.2 scanf() 函数
    • 4.4.3 printf() 和 scanf() 的 * 修饰符

4.1 前导程序

#include <stdio.h> 
#include <string.h>   //提供 strlen() 函数的原型 
#define DENSITY 62.4  //人体密度(单位:磅/立方英尺int main(void) 
{float weight, volume;int size, letters;char name[40];        // name 是一个可容纳40个字符的数组printf("Hi! What's your first name?\n"); scanf("%s",name);printf("%s,what's your weight in pounds?\n",name);scanf("%f", &weight);size = sizeof name;letters = strlen(name);volume = weight / DENSITY;printf("Well, %s, your volume is %.2f cubic feet\n", name, volume);printf("Also, your first name has %d letters,\n", letters);printf("and, we have %d bytes to store it.\n", size);return 0;}

运行结果:
在这里插入图片描述

  • 用数组(array)储存字符创(character string)。在该程序中,用户输入的名被储存在数组中,该数组占内存中40个连续的字节,每个字节储存一个字符值。
  • 使用 %s 转换说明来处理字符串的输入和输出。注意,在 scanf() 中,name 没有前缀,而 weight 有,因为用 scanf() 把字符串读入字符数组中,不用 &。
  • 用 C 预处理器把字符常量 DENSITY 定义为 62.4。
  • 用 C 函数 strlen() 获取字符串的长度。

4.2 字符串简介

字符串(character string)是一个或多个字符的序列,如下所示:

char = ch;
ch = “Zing went the strings of my heart!;

双引号不是字符串的一部分。
双引号仅告知编译器它括起来的是字符串,正如单引号用于标识单个字符一样。

4.2.1 char 类型数组和 null 字符

C 语言没有专门用于储存字符串的变量类型,字符串都被储存在 char 类型的数组中。
数组由连续的存储单元组成,字符串中的字符被储存在相邻的存储单元中,每个单元储存一个字符。
在这里插入图片描述
注意:

图中数组末尾位置的字符 \0 。这是空字符(null character),C语言用它标记字符串的结束。
C 中的字符串一定以空字符结束,这意味着数组的容量必须至少比待存储字符串中的字符数多 1。

数组:
同类数据元素的有序序列。
如前导程序中,通过以下声明创建了一个包含40个存储单元(或元素)的数组,每个单元储存一个 char 类型的值:

char name[40];

name 后面的方括号表明这是一个数组,方括号中的 40 表明该数组中的元素数量。char 表明每个元素的类型。
在这里插入图片描述

4.2.2 使用字符串

#include <stdio.h>
#define PRAISE "You are a extraordinary being!"int main(void)
{char name[40];scanf("%s", name);printf("Hello, %s , %s\n",name, PRAISE);return 0; 
}

%s 告诉 printf() 打印一个字符串。 %s 出现两次,因为程序要打印两个字符串:一个储存在 name 数组中;一个由 PRAISE 来表示。
不用亲自把空字符放入字符串末尾,scanf() 在读取输入时就已经完成这项工作。
输出结果:
在这里插入图片描述
注意:
scanf() 在遇到第一个空白(空格、制表符或换行符)时就不再读取输入。因为,根据转义字符 %s ,scanf() 只会读取字符串中的第一个单词。

字符字符串
字符常量 ‘x’ 和字符串常量 “x” 不同;
区别一是 ‘x’ 是基本类型(char),而 “x” 是派生类型(char 数组);
区别二是 “x” 实际上由两个字符组成:‘x’ 和空字符 \0。

4.2.3 strlen() 函数

sizeof 运算符

  • 是以字节为单位给出对象的大小;
  • 它会把字符串末尾不可见的空字符也计算在内;
  • 运算对象是类型时,必须加圆括号,如:sizeof(int);
  • 运算对象是特定值,圆括号可有可无,建议所有情况都加上圆括号。
  • 用转义说明 %zd 。

strlen() 函数

  • 给出字符串中的字符长度,也就是字符串中的字符数(包括空格和标点符号)。
  • 用转义说明 %zd 。

4.3 常量和 C 预处理器

有时,在程序中要使用常量。
例如,计算圆周长:

circumference = 3.14159 * diameter;

但,使用 符号常量 (symbolic constant) 会更好,计算机会给出实际值完成替换:

circumference = pi * diameter;

4.3.1 符号常量

1. 使用符号常量的好处:

  • 常量比数字表达的信息更多。
  • 更改起来更加方便,如果程序使用符号常量,只需更改符号常量的定义;无序逐一修改。

2. 创建符号常量

法一:

float taxrate;
taxrate = 0.015;

这样做提供一个符号名,但 taxrate 是一个变量,程序可能会无意间改变它的值。

法二:C 预处理器

/*格式:
#define NAME value  没有 = 和 ; 全大写表示符号常量是C语言的一贯传统,
这样在程序中看到全大写就立刻明白是个符号常量,而非变量。
*/
#define TAXTATE 0.15

小练习:

#include <stdio.h>
#define PI 3.14259
int main(void)
{float area, circum, radius;printf("What's the radius of your pizza?\n");scanf("%f", &radius);area = PI * radius * radius;circum = PI * radius * 2.0;printf("Your basic pizza parameters are as follows:\n");printf("circumference: %1.2f, area: %1.2f.\n", circum , area);return 0;
}

printf() 语句中 %1.2f 表明,结果被四舍五入为两位小数输出。

#define 指令还可以定义字符和字符串常量,前者用单引号,后者用双引号。

#define BEEP '\a'
#define TEE 'T'
#define ESC '\033'
#define OOPS "Now you have done it!"

4.3.2 const 限定符

C90 标准新增了 const 关键字,用于限定一个变量只读。其声明如下:

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

MONTHS 成为一个只读值。也就是说,可以在计算中使用MONTHS,可以打印MONTHS,但是不能更改MONTHS的值。
const 用起来比 #define 更加灵活。

4.3.3 转换说明的意义

转换说明把二进制格式储存在计算机中的值转换成一系列字符(字符串)以便显示。

4.4 printf() 和 scanf()

4.4.1 printf() 函数

printf() 函数把整数、浮点数、字符和字符串转换成显示在屏幕上的文本;
由于 printf() 函数使用 % 符号来标识转换说明, 如果要打印一个 % 符号,就使用两个 % 符号。

pc = 2*6;
printf("Only %d%% of Sally's gribbles were edible.\n");
/*输出结果:
Only 12% of Sally's gribbles were edible.
*/

当 printf() 语句太长,可给语句分行,但是不能在双引号括起来的字符串中断行。

4.4.2 scanf() 函数

scanf() 函数把输入的字符串转换成整数、浮点数、字符或字符串。
printf() 函数使用变量、常量和表达式,而 scanf() 函数使用指向变量地址的指针。

  • 如果用 scanf() 读取基本变量类型的值,在变量名前加上一个&
  • 如果用 scanf() 把字符串读入字符数组中,不使用&。
#include <stdio.h>
int main(void)
{int age;float assets;char pet[30];printf("Enter your age,assets,and favourite pet.\n");scanf("%d %f",&age,&assets);scanf("%s",&pet);printf("%d %.2f %s\n",age ,assets,pet);return 0;
}

输出结果:
在这里插入图片描述
scanf() 函数使用空白(换行符、制表符和空格)把输入分为多个字段。在依次把转换说明和字段匹配时跳过空白。
注意 %c 转换说明,根据 %c ,scanf() 会读取每个字符,包括空白。

格式字符串中的普通字符
scanf() 函数允许把普通字符放在格式字符串。除空格字符外的普通字符必须与输入字符串严格匹配。如在两个转换说明中添加一个逗号:

scanf("%d,%d", &n, &m);

scanf() 函数将其解释成:用户将输入一个数字、一个逗号,然后再输入一个数字。

注意:
除了 %c ,其他转换说明都会自动跳过待输入值前面所有的空白。
对于 %c,如果在格式字符串中把空格放到 %c 的前面,scanf() 便会跳过空格,从第1个非空白字符开始读取。

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

printf() 函数的 * 修饰符:
如果你不想预先指定字段宽度,希望通过程序来指定,那么可以用 * 修饰符代替字段宽度。
但还是要用一个参数告诉函数,字段宽度应该是多少。
如果转换说明是 %*d ,那么参数列表中应包含 * 和 d 对应的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291775.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ios之第一个程序Hello word, I am chenyu !

1、下载Xcode 个人建议网上下载Xcode&#xff0c;快些&#xff0c;特么再应用商店下载像日了狗一样&#xff0c;还要填写资料&#xff0c; 最后资料没有写好&#xff0c;无效字符。2、新建项目 下载好了Xcode&#xff0c;一步一步往下点就行&#xff0c;然后create 项目然后找m…

小博老师解析Java核心技术 ——JSwing绘图技术

2019独角兽企业重金招聘Python工程师标准>>> [引言] 我们在学习Java编程的时候&#xff0c;如果需要开发客户端窗体类型的程序&#xff0c;可以使用JDK中的awt和swing库。本文开始小博老师就继续为大家演示Java窗体编程中的绘图技术&#xff0c;今天主要讲解绘图技术…

.NET6之MiniAPI(十三):健康检查

程序员开发程序&#xff0c;是“生”的过程&#xff0c;运维人员负责日常运维&#xff0c;是“养”的过程&#xff0c;在养的过程&#xff0c;运维人员希望在第一时间了解程序的状况&#xff0c;健康检查&#xff0c;是最基础的手段。var builder WebApplication.CreateBuilde…

linux之用 grep -r 关键字 快速搜索在目录下面的含有关键字的文件

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程 1、快速搜索在目录下面的含有关键字的文件 我们采用下面命令cd directoriesgrep -r 关键字2、搜索结果

python 抓包基于pypcap

2019独角兽企业重金招聘Python工程师标准>>> 1、查询python和python-dev是否安装 dpkg-query -l python dpkg-query -l python-dev #没安装就先安装 sudo apt-get install python python-dev 2、安装flex和bison sudo apt-get install flex bison3、下载libpcap并安…

推荐一个基于Dapr的 Red Dog 的完整微服务应用程序

微服务尽管构建起来非常困难&#xff0c;但它们已成为一种越来越流行的架构模式。随着开发人员开始将他们现有的单体代码库迁移到微服务系统&#xff0c;他们花费大量时间来处理分布式应用程序带来的固有挑战&#xff0c;例如状态管理和服务调用。通过引入Dapr 通过以 http/gRP…

基于事件的 NIO 多线程服务器

2019独角兽企业重金招聘Python工程师标准>>> JDK1.4 的 NIO 有效解决了原有流式 IO 存在的线程开销的问题&#xff0c;在 NIO 中使用多线程&#xff0c;主要目的已不是为了应对每个客户端请求而分配独立的服务线程&#xff0c;而是通过多线程充分使用用多个 CPU 的处…

第6章 C控制语句:循环

学习笔记——《C Prime Plus》 第6章 C控制语句&#xff1a;循环6.1 再探 while 循环6.1.1 程序注释6.1.2 C风格读取循环6.2 while 语句6.2.1 终止 while 循环6.2.2 何时终止循环6.2.3 while&#xff1a;入口循环条件6.2.4 语法要点6.3 _Bool 类型6.4 不确定循环和计数循环6.5 …

openresty 前端开发进阶一之http后端

2019独角兽企业重金招聘Python工程师标准>>> 做前端开发&#xff0c;大多数情况下&#xff0c;都需要跟后端打交道&#xff0c;而最常见的方式则是通过http请求&#xff0c;进行通信。 在openresty中&#xff0c;通过http跟后端整合通信的方式又很多种&#xff0c;各…

第7章 C控制语句:分支和跳转

学习笔记——《C Prime Plus》 第7章 C控制语句&#xff1a;分支和跳转7.1 if 语句7.2 if else 语句7.2.1 介绍 getchar() 和 putchar()7.4 一个统计单词的程序7.1 if 语句 下程序读取一列数据&#xff0c;每个数据都表示每日的最低温度&#xff08;℃&#xff09;&#xff0c…

【Blog.Core开源】网关统一集成下游服务文档

一般看到公众号更新&#xff0c;就是大概率要开始上班了&#x1f602;上回书咱们说到了《【Blog.Core开源】快速预览Admin界面效果》&#xff0c;这样我们就可以专注于后端开发&#xff0c;而且也能快速的实现效果的预览。那今天我们继续来往下走&#xff0c;说一说网关相关的内…

android4.3 截屏功能的尝试与失败分析

1.背景 上一篇讲了在源码中捕获到了android手机的截屏函数&#xff08;同时按下电源键与音量减&#xff0c;详情http://blog.csdn.net/buptgshengod/article/details/19911909&#xff09;&#xff0c;经过一周的研究还是没有在手机上实现系统截屏功能&#xff0c;总结下尝试的…

numpy方法总结

2019独角兽企业重金招聘Python工程师标准>>> 一、数组方法 创建数组&#xff1a;arange()创建一维数组&#xff1b;array()创建一维或多维数组&#xff0c;其参数是类似于数组的对象&#xff0c;如列表等 反过来转换则可以使用numpy.ndarray.tolist()函数&#xff0…

阿里云离线数据仓库

阿里云离线数据仓库第1章 数据仓库概念第2章 项目需求及架构设计2.1 项目需求分析2.2 阿里云技术框架2.2.1 技术选型2.2.2 系统数据流程设计第3章 数据生成模块3.1 埋点数据基本格式3.2 事件日志数据3.2.1 商品列表页&#xff08;loading&#xff09;3.2.2 商品曝光&#xff08…

技术分享 | 混合云模式下SaaS端前端最佳实践

导读&#xff1a;集成开放平台采用的是混合云部署架构&#xff0c;包含两个大的组件&#xff0c;管理控制台和引擎。管理控制台是SaaS的&#xff0c;部署在公有云&#xff0c;按租户隔离。引擎部署在客户私有云。一套SaaS版的管理控制台如何适配不同客户的引擎&#xff0c;本文…

记一则Hadoop DataNode OOM故障,以及解决方案

一、故障症状最近公司一个集群跑大任务时&#xff0c;datanode日志报DataXceiveServer: Exiting due to:java.lang.OutOfMemoryError: unable to create new native thread异常&#xff0c;然后计算节点上的DataNode直接挂掉。DataNode异常日志截图如下&#xff1a;2014-03-06 …

阿里云实时数据仓库

阿里云实时数据仓库——学习笔记 课程目标 学习搭建一个实时数据仓库&#xff0c;掌握数据采集、存储、计算、输出、展示等整个业务流程。整个实时数据仓库系统是在阿里云架构上搭建&#xff0c;掌握并学会运用各个服务组件&#xff0c;及各个组件之间如何联动。前置知识要求&…

手动挡五个档位示意图_汽车档位越多越好?听听专业回答

如今的汽车市场百花齐放&#xff0c;汽车厂商们也不断在研发过程中寻找不同的突破口&#xff0c;其中汽车变速器的档位变化就是众多汽车品牌当做噱头的重点&#xff0c;不知从什么时候开始&#xff0c;自动变速箱档位数量变多成为了深受汽车品牌喜爱的突破点&#xff0c;渐渐的…

Android之用netcfg命令获取手机虚拟网卡tun0的信息

1、在终端输入下面命令 adb shell adb netcfg 2、展示结果 3、使用总结 我们得到手机 tun0 地址为10.1.102.11 然后在vpn后台&#xff0c;我们先找到是哪个tun&#xff0c;我们可以使用ip route命令ip route show table2 这个允许结果就是 地址 哪个tun比如我们得到是tun2 然…

C# 基于事件的异步模式

点击蓝字 关注我们开工大吉EventBasedAsyncPattern 方法使用了基于事件的异步模式。这个模式定义了一个带有 “Async” 后缀的方法。示例代码再次使用了WebClient 类。对于同步方法DownloadString&#xff0c;WebClient类提供了一个异步变体方法 DownloadStringAsync。当请求完…