字符常量与变量

  在这一节中,我们来讨论字符与字符串。

1. 字符常量

  如果我想在屏幕上打印"HelloWorld"。应该怎样做呢?大家应该很熟悉这个代码了。

#include <stdio.h>
int main()
{printf("HelloWorldn");return 0;
}

  我们使用printf函数,第一个参数是需要输出的字符串。字符串用双引号包括。

  不知道大家有没有考虑过,字符串是由什么组成的呢?没错,就是我们这一节讨论的字符了。

  那如果我单独用字符来打印HelloWorld,将代码改为如下这样。

#include <stdio.h>
int main()
{printf("H");printf("e");printf("l");printf("l");printf("o");printf("W");printf("o");printf("r");printf("l");printf("d");printf("n");return 0;
}

  这样看上去是在单个单个的输出字符。但是,我们要注意,字符串是用双引号包括的。也就是说,这上面输出的仍然是字符串,只不过是只有一个可打印字符的字符串罢了。

  那我们怎样,用单个字符的形式来输出呢?

定义:字符常量由单引号包括

  类似于'a'  ,  'b' ,  'c' ,  '1' ,  '2' ,  'n'。这样的都是字符常量。

  'ab'这样的写法是错误的,字符常量只允许有一个字符。如果需要多个字符,请使用字符串"ab"。

  那么,'n'不是两个字符吗?是的,n是两个字符,但是它代表的是换行符。我们C语言中,换行符没法直接打在代码当中。难道要像下面这样打出来?

'
'

  而且,会和代码格式的换行弄混淆。所以,我们用来表示转义,斜杠加字母的形式,表示为另一个意思。这样的字符有很多,例如,换行'n',退格'b',制表't'等等。

  好的,那我们知道了,单引号包括的是字符,那我们这样打印行不行?

#include <stdio.h>
int main()
{printf('H');printf('e');printf('l');printf('l');printf('o');printf('W');printf('o');printf('r');printf('l');printf('d');printf('n');return 0;
}

  答案是不行的,这样会编译报错。为什么呢?printf的第一个参数必须是字符串。那如果是这样的话,我们考虑能不能用printf函数的占位符来给字符占位。然后,在printf的后续参数里面传入字符串呢。之前我们已经了解到了,整数用%d,浮点数用%f。那么字符用什么呢?

  字符请使用转换方式%c。

#include <stdio.h>
int main()
{printf("%c%c%c%c%c%c%c%c%c%c%c", 'h', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd', 'n');return 0;
}

  正如你看到的,%c可以用于给字符占位。

2. 字符类型与字符变量

  有了字符常量,那我们肯定需要一种类型,来定义字符变量。

关键词char,是字符类型。

  定义一个字符变量

char c1 = 'a';
char c2 = '1';
char c3 = 'n';

  打印这三个变量

#include <stdio.h>
int main()
{char c1 = 'a';char c2 = 'n';char c3 = '1';printf("c1=%c c2=%c c3=%c", c1, c2, c3);return 0;
}

  第一个%c被替换成了a,第二个被替换成了换行,第三个被替换成了1。

  那么我们来看看,char这种类型的数据大小吧,用关键词sizeof。

好的,我们证实了,char都是1个字节的。

  接下来,我们思考一个问题。事实上,我们在整型那一节中,已经见过char了,char也属于一种整型变量。而在printf那一节中,我们知道了对于变参函数的可变参数部分。比int小的整型类型,都会转换为int。所以,我们可以用%d来打印short类型。很显然,char是一个字节,肯定是比int小的。那么,我们也可以用%d来打印char。来看看,char里面所存储的数值是多少。

  观察结果,a,b,c,d,e,居然是连续的。那我们有理由推测,字符和数值,存在某种联系。

  是的,这种猜测是正确的。字符在计算机里面就是以数值形式存储的。关键是,你把它看做是字符,还是数值。

  97,98,99,100,101如果你以%d打印,那么它们输出的是数值。如果你以%c打印,那么它们输出的是字符。那么,我们为什么还要char,字符类型char呢?int也可以呀。因为在早期,计算机只考虑了拉丁字符集,小写的a到z,大写的A到Z加上数字0到9,标点符号。全部加起来就127个。char的数值范围是-128到127,那么完全足够了。所以,不需要使用其它更大的类型来存储。

  那我们来看一下这0-127数值与字符的对应关系吧。这个对应关系被称之为ASCII(American Standard Code for Information Interchange),美国信息交换标准代码。

图片来自百度百科

  在表中,我们可以明确看到a对应97,b对应98,c对应99,d对应100,e对应101。和我们刚刚代码运行的结果一致。

3. 字符串

  那么字符串,自然可想而知,就是由一个个字符组成的了。为了区分,字符串由双引号包括。例如:"HelloWorld","a"。

  我们也来测试一下字符串的占用的空间大小。

  HelloWorld一共10个字符,为什么sizeof测试出来的结果是11呢?

  回答这个问题之前,我们先看下面的代码。

#include <stdio.h>
int main()
{printf("%s", "HelloWorld");return 0;
}

我们用%s来作为字符串的占位。

  我们思考一个问题,为什么%s能打印HelloWorld完就结束了呢?它是怎么知道,我们这次输送的一共10个字符呢?我们来看一下字符串的内存组成。

  这下是11个了吧。没错,C语言自动帮我们添加了结束的字符'0'。我们尝试一下,将0添加在字符串中间。会是一个什么效果。

  没错,%s在解析的时候发现了'0'就认为字符串结束了,所以world就没有被打印出来了。

  那我们来看看'0'和'n'的数值是多少。

  '0'对应的数值是0,'n',对应的数值是10。在ASCII表中,位置如下。

  注意,千万不要将数值与字符搞混了。字符'0'的ascii码是48,而'0'才是ascii的0。

  '0'被认为是结束符,而'0'被认为是普通的字符。

  '0'的数值为0,而'0'的数值为48。

  最后,我们知道%号和都被用作特殊用途了。一个被用于占位符的开始,一个被用于字符转义。那如果我们确实需要打印%号和怎么办呢?

4. getchar、putchar函数

  getchar函数用于从键盘读取一个字符。

  putchar函数用于输出一个字符。

  使用getchar的时候,输入完字符,请按回车键。

5. 中文字符串

  C语言支持中文字符串,但是你会发现ASCII中没有中文。

  早期在制定标准的时候,并且考虑到非拉丁字符。目前,计算机已经在全世界范围内使用。为了兼容早期的ASCII,高于127的数值,将会被用于其他语言字符。但是,这还是不够用于所有的非英文字符的。所以,中文字符会是由多个char组成。

  在下面的例子中我们看到"你好"的空间大小为5。除去'n',那么就是每个中文汉字占用2个字节。

c++ 把数字和中文字符分开_C语言中的字符常量与变量相关推荐

  1. c语言设置输出字符大小_C语言中常用的几个头文件及库函数

    点击上方"C语言中文社区",选择"设为星标★" 技术干货第一时间送达! 来源:https://www.jb51.net/article/124594.htm 这 ...

  2. c语言字符常量和字符串常量_C语言中的字符常量

    c语言字符常量和字符串常量 Any character (a single character) that is enclosed within the single quotes (like, 'A ...

  3. c语言 字符相加_C语言中自加自减的编译原理

    自增自减规则 i++ 与 ++i 的主要区别有两个: 1. i++ 返回原来的值,++i 返回加1后的值. 2. i++ 不能作为左值,而++i 可以. 毫无疑问大家都知道第一点(不清楚的看下下面的实 ...

  4. c语言中的普通字符包括什么,【判断题】C语言中的字符常量通常有两种形式:普通字符和转义字符。...

    [判断题]C语言中的字符常量通常有两种形式:普通字符和转义字符. 更多相关问题 ---Can you speak French?---Yes, but only____.A.a littleB.lit ...

  5. java发送c语言结构体_C语言中结构体直接赋值?

    在C语言中结构体变量之间可以进行赋值操作吗? 简单结构体的赋值 先说结论:一般来说,C语言中的结构体变量可以用另一个变量对其进行赋值或初始化.简单结构体(不包含指针成员)直接赋值没有问题. 我们先下面 ...

  6. c++ 箭头符号怎么打_C++语言中的标识符只能由字母、数字、下划线三种字符组成,且第一个字符_____。...

    [判断题]尺寸界线可以被隐藏 . . [判断题]AutoCAD 的绘圆心标记功能只是用于为圆或圆弧绘圆心标记或中心线,并不能标注尺寸. [判断题]将成本按其可辨认性分为直接成本与间接成本有利于分清各部 ...

  7. ssis 转换中文字符乱码_SSIS软件包中的字符映射转换

    ssis 转换中文字符乱码 This article explores the Character Map Transformation in SSIS package with available ...

  8. c语言中百分号后面跟的数字_C语言中的各种百分号都代表什么意思

    C语言中的各种百分号都代表什么意思 mip版  关注:259  答案:4  悬赏:60 解决时间 2021-01-27 22:51 已解决 2021-01-27 10:19 比如 d% s%最好能列一 ...

  9. (mfc)将字符串中的字符逐个按行输出_C语言中字符串输入输出

    在C语言中没有字符串类型,用字符数组处理字符串 定义 字符数组定义:char 数组名 [常量表达式][常量表达式] 一维字符数组,用于存储和处理一个字符串 . 二维字符数组,用于同时存储和处理多个字符 ...

最新文章

  1. Dockerfile基本结构
  2. 数据结构实验之查找四:二分查找(递归实现和while循环实现)
  3. 开启MyBatis日志Sql打印
  4. crtsiii型无砟轨道板_自主知识产权CRTSⅢ型轨道板助力,赣深铁路无砟轨道轨道板灌注第一工作面完成...
  5. Java中HashMap的原理
  6. mysql_use_result与mysql_store_result异同点
  7. 轻松下载网易云音乐中的歌曲
  8. Packet Tracer 思科模拟器入门教程 之十 路由器单臂路由配置
  9. 关于 EOF EOF; 是什么意思?
  10. C语言中常见的转义字符总结
  11. 苹果开发者账号官方翻译篇-账号简介
  12. uniapp App端 实现pdf文件预览
  13. Excel - 快速找出数据差异
  14. 虹软人脸识别SDK接入Milvus实现海量人脸快速检索
  15. 单点登录系统的设计与实现方案
  16. 响铃:暴跌后仅有8倍PE,趣店为何还在跌跌不休?
  17. Kibana查询语言(KQL)AND、OR匹配,模糊匹配
  18. Centos 7 拨号上网
  19. 大多数人没听过的FreeEIM飞鸽传书,超炫酷的仿QQ,九零后都爱玩
  20. 线上前端静态资源代理到本地的几种方式

热门文章

  1. hibernate 7大主键生成策略详解与对象状态
  2. Mybatis 缓存系统源码解析
  3. Guava区间-Range
  4. bootstrap-wysiwyg中JS控件富文本的用法
  5. 一个DBA的工作写照
  6. struts2 中文乱码问题
  7. mysql group by 分组查询
  8. golang 使用 http socks5 代理
  9. mysql数据库 一条语句实现记录存在则更新,不存在则插入
  10. python3 操作redis