字符型数据详解

1 字符常量

C的字符常量是用单撇号括起来的一个字符。如'a','x','D','?','$'等都是字符常量。注意,'a'和'A'是不同的字符常量。

除了以上形式的字符常量外,C还允许用一种特殊形式的字符常量,就是以一个“\”开头的字符序列。例如,前面已经遇到过的,在printf函数中的'\n’,它代表一个“换行”符。这是一种“控制字符”,在屏幕上是不能显示的。在程序中也无法用一个一般形式的字符表示,只能采用特殊形式来表示。

常用的以“\”开头的特殊字符见表3.3。

表3.3中列出的字符称为“转义字符”,意思是将反斜杠(\)后面的字符转换成另外的意义。如'\n'中的“n”不代表字母n而作为“换行”符。

表 3.3中最后第2行是用ASCII码(八进制数)表示一个字符,例如'101'代表 ASCII码(十进制数)为65的字符“A”。'\012'(十进制ASCII码为10)代表“换行”。用'376’代表图形字符“■”。用表3.3中的方法可以表示任何可输出的字母字符、专用字符、图形字符和控制字符。请注意'\0'或'\000'是代表ASCI码为0的控制字符,即“空操作”字符,它将用在字符串中。

例3.5 转义字符的使用。

main()

{printf("_ab_c\t_de\rf\tg\n");

printf("h\ti\b\bj _k");

}

程序中没有设字符变量,用printf函数直接输出双引号内的各个字符。请注意其中的“转义字符”。第一个printf函数先在第一行左端开始输出“_ab_c”,然后遇到“\t”,它的作用是“跳格”,即跳到下一个“制表位置”,在我们所用系统中一个“制表区”占8列。“下一制表位置”从第9列开始,故在第9~11列上输出“_de”。下面遇到“\r”,它代表“回车”(不换行),返回到本行最左端(第1列),输出字符“f”,然后遇“\t”再使当前输出位置移到第9列,输出“g”。下面是“\n”,作用是“使当前位置移到下一行的开头”。第二个 printf函数先在第1列输出字符“h”,后面的“\t”使当前位置跳到第9列,输出字母“i”,然后当前位置应移到下一列(第10列)准备输出下一个字符。下面遇到两个“\b”,“\b”的作用是“退一格”,因此“\b\b”的作用是使当前位置回退到第8列,接着输出字符“j_k”。

程序运行时在打印机上得到以下结果:

fab_c___gde

h ______ jik

注意在显示屏上最后看到的结果与上述打印结果不同,是:

f_______gde

h______ j_k

这是由于“\r”使当前位置回到本行开头,自此输出的字符(包括空格和跳格所经过的位置)将取代原来屏幕上该位置上显示的字符。所以原有的“_ab_c____”被新的字符“f_______ g”代替,其后的“de”未被新字符取代。换行后先输出“h_______ i”,然后光标位置移到i右面一列处,再退两格后输出“j_k”,j后面的“_”将原有的字符“i”取而代之。因此屏幕上看不到“i”。实际上,屏幕上完全按程序要求输出了全部的字符,只是因为在输出前面的字符后很快又输出后面的字符,在人们还未看清楚之前,新的已取代了旧的,所以误以为未输出应输出的字符。而在打印机输出时,不像显示屏那样会“抹掉”原字符,留下了不可磨灭的痕迹,它能真正反映输出的过程和结果。

2 字符变量

字符型变量用来存放字符常量,请注意只能放一个字符,不要以为在一个字符变量中可以放一个字符串(包括若干字符)。

字符变量的定义形式如下:

char cl,c2;

它表示c1和c2为字符型变量,各可以放一个字符,因此在本函数中可以用下面语句

对c1、c2赋值:

e1='a';c2-'b';

在所有的编译系统中都规定以一个字节来存放一个字符,或者说一个字符变量在内存中占一个字节。

3 字符数据在内存中的存储形式及其使用方法

将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCI代码放到存储单元中。例如字符'a'的ASCII 代码为97,'b'为 98,在内存中变量c1、c2的值如图3.8(a)所示。实际上是以二进制形式存放的,如图 3.8(b)所示。

既然在内存中,字符数据以ASCII码存储,它的存储形式就与整数的存储形式类似。这样使字符型数据和整型数据之间可以通用。一个字符数据既可以以字符形式输出,也可以以整数形式输出。以字符形式输出时,需要先将存储单元中的 ASCII码转换成相应字符,然后输出。以整数形式输出时,直接将ASCII码作为整数输出。也可以对字符数据运算。此时相当于对它们的ASCII码进行算术。

例3.6 向字符变量赋以整数。

main()

{char c1,c2;

c1=97;

c2=98;

printf(" %c %c\n" ,c1,c2);

printf(" %d %d\n",cl,c2);

}

cl、c2被指定为字符变量。但在第3和第4行中,将整数97和 98分别赋给c1和c2,它的作用相当于以下两个赋值语句:

c1='a';c2='b';

因为'a'和'b'的ASCII码为97和98。在程序的第3和第4行是把97和98两个整数直接存放到c1和c2的内存单元中。而cl='a'和c2='b'则是先将字符'a'和'b'化成 ASCII 码97和98,然后放到内存单元中。二者的作用和结果是相同的。第5行输出两个字符a和 b。“%c”是输出字符时必须使用的格式符。程序第6行输出两个整数97和98.程序运行时输出如下:

a   b

97  98

可以看到:字符型数据和整型数据是通用的。它们既可以用字符形式输出(用%c),也可以用整数形式输出(用%d),见图3.9。但是应注意字符数据只占一个字节,它只能存放0~255范围内的整数。

例3.7 大小写字母的转换。

main()

{char cl,c2;

c1='a';

c2='b';

c1=c1-32;

c2=c2-32;

printf(" %c %c",c1,c2);

}

运行结果为

A B

程序的作用是将两个小写字母a和b转换成大写字母A 和 B。'a'的 ASCII码为 97,而'A'为 65,'b'为 98,'B'为 66。从 ASCI代码表中可以看到每一个小写字母比它相应的大写字母的ASCII码大32.C语言允许字符数据与整数直接进行算术运算,即'A'+32会得到整数 97,'a'-32会得到整数65。

C语言对字符数据作这种处理使程序设计时增大了自由度。例如对字符作各种转换就比较方便,而在BASIC语言中,为了将小写字母a转换成大写字母A,需要用两个字符处理函数:用ASC函数将字符转换成其相应的ASCII码,再用CHR$函数将ASCII码转换为字符:

PRINT CHR $ (ASC("a")-32)

这样来回转换,既增加程序的复杂性,又增加计算时间的开销。

字符数据与整型数据可以互相赋值。如:

int i;

char c;

i='a';

c=97;

是合法的。如果用格式符“%d”将i的值输出,可得到97。用“%c”输出c,可得字符'a'。

如果在上面语句之后执行以下语句:

printf(" %c,%d\n",c,c);

printf(" %c,%d\n",i,i);

输出:

a,97

a,97

说明:有些系统(如PDP,VAX-11,TurboC)将字符变量中的最高位作为符号位,也就是将字符处理成带符号的整数,即signed char型。它的取值范围是一128~127。如果使用ASCII码为0~127间的字符,由于字节中最高位为0,因此用%d输出时,输出一个正整数。如果使用ASCII 码为128~255间的字符,由于在字节中最高位为1,用%d 格式符输出时,就会得到一个负整数。例如

char c=130;

printf(*%d". c);

得到一126。如果不想按有符号处理,可以将字符变量定义为unsigned char 类型,这时其取值范围是0~255。signed char 和unsigned char的含义及用法与signed int和 unsigned int相仿,但它只有一个字节。

4 字符串常量

前面已提到,字符常量是由一对单撇号括起来的单个字符。C语言除了允许使用字符常量外,还允许使用字符串常量。字符串常量是一对双撇号括起来的字符序列。如,

"How do you do.","CHINA"."a"," $123.45"

都是字符串常量。可以输出一个字符串,如

printf("How do you do." );

不要将字符常量与字符串常量混淆。'a'是字符常量,"a"是字符串常量,二者不同。假设c被指定为字符变量:

char c;

c='a';

是正确的。而

c="a";

是错误的。

c="CHINA"

也是错误的。不能把一个字符串赋给一个字符变量。

有人不能理解'a'和"a"究竟有什么区别?C规定:在每一个字符串的结尾加一个“字符串结束标志”,以便系统据此判断字符串是否结束。C规定以字符'0’作为字符串结束标志。\0’是一个ASCI码为0的字符,从ASCII代码表中可以看到ASCI1 码为0的字符是“空操作字符”,即它不引起任何控制动作,也不是一个可显示的字符。如果有一个字符串"CHINA”,实际上在内存中是

C  H I N A \0

它占内存不是5个字节,而是6个字节,最后一个字节为'\0’。但在输出时不输出'\0’。例如在prinf("how do you do.")中,输出时一个一个字符输出,直到遇到最后的'\0'字符,就知道字符串结束,停止输出。注意,在写字符串时不必加0’,否则会画蛇添足\0’字符是系统自动加上的。字符串"a",实际上包含2个字符:'a'和'\0',因此,把它赋给只能容纳一个字符的字符变量c:

c="a";

显然是不行的。

在C语言中没有专门的字符串变量(BASIC中的字符串变量形式为A$、B$等),如果想将一个字符串存放在变量中,以便保存,必须使用字符数组,即用一个字符型数组来存放一个字符串,数组中每一个元素存放一个字符。

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

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

相关文章

DPDK and Trex环境指南

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、测试拓扑图 二、VirtualBox的网卡配置 三、DPDK支持的网卡 四、DPDK安装 1.DPDK向导 1). 英文向导 2). 中文向导 2.DPDK源码下载 3.DPDK源码解压 4.…

今日问题:动态分配内存出错

2024.3.22 在搜素了许多文章和查阅了许多博客后依然没有找到问题所在&#xff0c;最后无意之间翻看以前的关于动态内存管理的代码后发现&#xff1a; 没加头文件&#xff1a;#include<stdlib.h> 苦笑不得了属于是 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio…

蓝桥杯day7刷题日记

P8697 [蓝桥杯 2019 国 C] 最长子序列 思路&#xff1a;直接遍历&#xff0c;和子序列相同就记录&#xff0c;不然就下一位 #include <iostream> #include <string> using namespace std; int res;int main() {string s,t;cin>>s>>t;int i0,j0;while…

关于msvcp140.dll丢失的解决方法详情介绍,修复dll文件的安全注意事项

在使用电脑的过程中&#xff0c;是否有遇到过关于msvcp140.dll丢失的问题&#xff0c;遇到这样的问题你是怎么解决的&#xff0c;都有哪些msvcp140.dll丢失的解决方法是能够完美解决msvcp140.dll丢失问题的&#xff0c;今天小编将带大家去了解msvcp140.dll文件以及分析完美解决…

代码随想录 Day-23

力扣题目 406.根据身高重建队列 思路 这里可以看出来是有两个维度考虑&#xff0c;和力扣题目 135.分发糖果&#xff08;可以看我day-22的文章&#xff09; 有点类似。 因此遇到这种两个维度权衡的时候&#xff0c;一定是先考虑一个维度再按照另一个维度来重新考虑排序。 两…

innodb 的 buffer pool 管理 page

page 页结构 page是整个InnoDB存储的最基本构件&#xff0c;也是InnoDB磁盘管理的最小单位&#xff0c;与数据库相关的所有内容都存储在这种Page结构里。 Page分为几种类型&#xff0c;常见的页类型有 数据页(Btree Node)Undo页(Undo Log Page)系统页(System Page)事务数据页 …

PC显示字体和浏览器的字体不一致

1&#xff1a;设置了PC的区域&#xff0c;显示字符&#xff0c; 2&#xff1a;导致浏览器显示的字符一半大一半小 3&#xff1a;为什么去设置这个&#xff0c;因为担心封号 4&#xff1a;不让它检测出我是他大佬

【C++初阶】第七站:string类的初识(万字详解、细节拉满)

前言&#xff1a; &#x1f4cd;本文知识点&#xff1a;string的初识 &#x1f4a8;个人博客:Dream_Chaser&#xff5e;-CSDN博客 &#x1f6a9;本专栏&#xff1a;C 目录 一、什么是STL 二、STL的六大组件 三、STL的缺陷 四、为什么学习string类&#xff1f; 五、标准库中…

云ERP vs 本地ERP:优劣对比与选择指南

在性能方面&#xff0c;本地ERP需要需要较高级别的计算机系统和其他设备来确保其高效运行。如果企业的计算机设备不够先进&#xff0c;那么选择本地ERP可能导致系统性能下降。而云ERP解决方案则能保证性能&#xff0c;只要企业拥有稳定的互联网连接即可。 在成本方面&#xff0…

Linux的基本使用

1.Linux的背景 1.1什么Linux Linux是⼀个操作系统.和Windows是"并列"的关系. 1.2Linux系统的优势 1. 开源(意味着免费,便宜) 2. 稳定(Linux可以运⾏很多年,都不会发⽣重⼤问题) 3. 安全(Linux只有管理员或者特定⽤⼾才能访问Linux内核) 4. ⾃由(不会被强加商业产品和…

EasyCloud软件简介

运行环境&#xff1a;Win10 PCL1.9 VTK8.1 Qt5.12 VS2017 基于PCL点云库的三维点云数据处理软件 1&#xff0e;软件用户界面 本软件的用户界面主要包括以下几个部分&#xff08;如图1&#xff09;&#xff1a; [1]菜单栏&#xff0c;将软件功能模块划分为不同菜单&…

JAVA八股--集合面试题

AVA八股--集合面试题--上 java只有值传递&#xff0c;没有引用传递代理模式Java之HashMap和Hashtable选用 ArrayDeque 来实现队列要比 LinkedList 更好为什么HashMap的长度一定是2的次幂&#xff1f;HashMap常见遍历方式 java只有值传递&#xff0c;没有引用传递 文章讲解 文…

第四讲 Buffer Pool

问题&#xff1a;DBMS 是如何管理其内存和磁盘之间来回移动数据的&#xff1f; 答案&#xff1a;在决定如何在磁盘中来回移动数据时&#xff0c;我们必须考虑两个关键方面&#xff1a; 空间控制【Spatial Control】&#xff1a; 将页【pages】写在在磁盘的什么地方&#xff…

vsc ctrl+. 无效的问题

描述 ubuntu ibus 输入法 vsc ctrl.快捷键无效 输出 _e 解决方案: 运行 ibus-setup 把表情符号这里的快捷键改了

mysql 空间查询 多边形内的点

数据库查询 # 1新增空间point类型坐标字段 ALTER TABLE gaoxin_isdp.business_master ADD COLUMN location2 point NULL AFTER location;# 2从原字段更新点位字段&#xff0c;原字段poi1是字符串106.474596,29.464360 UPDATE business_master SET location POINT(substr(poi…

基于Springboot+Vue的前后端分离的简单Demo案例(一)

后端创建Springboot项目 创建数据库表结构及表信息 添加依赖&#xff08;pom.xml&#xff09; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/X…

微服务网关介绍

1. 为什么是Spring Cloud Gateway 一句话&#xff0c;Spring Cloud已经放弃Netflix Zuul了。现在Spring Cloud中引用的还是Zuul 1.x版本&#xff0c;而这个版本是基于过滤器的&#xff0c;是阻塞IO&#xff0c;不支持长连接。Zuul 2.x版本跟1.x的架构大一样&#xff0c;性能也有…

GraalVM详细安装及打包springboot、java、javafx使用教程(打包普通JAVA项目篇)

前言 在当前多元化开发环境下&#xff0c;Java作为一种广泛应用的编程语言&#xff0c;其应用部署效率与灵活性的重要性日益凸显。Spring Boot框架以其简洁的配置和强大的功能深受开发者喜爱&#xff0c;而JavaFX则为开发者提供了构建丰富桌面客户端应用的能力。然而&#xff…

Python模块与包管理使用pip与virtualenv【第151篇—模块与包管理】

Python模块与包管理&#xff1a;使用pip与virtualenv 在Python开发中&#xff0c;模块和包管理是至关重要的&#xff0c;它们使得代码的组织、重用和共享变得更加简单和高效。本文将介绍两个Python生态系统中最常用的工具&#xff1a;pip和virtualenv。通过这些工具&#xff0…

探索医用制氧机的种类及其应用场景

医用制氧机是一种能够制取高纯度氧气的制氧设备&#xff0c;广泛应用于各种场景。随着科技的进步和行业需求的增加&#xff0c;医用制氧机的种类和应用领域也在不断扩展。本文将探索医用制氧机的多元种类及其应用领域&#xff0c;以更好地了解这一设备的重要性。 一、医用制氧机…