C语言入门经典读书笔记 ----第六章 字符串和文本的应用
1.什么是字符串
字符串常量的例子非常常见,字符串常量是放在一对双引号中的一串字符或符号,一对双引号之间的任何内容都会被编译器视为字符串,包括特殊字符和嵌入的空格。以下是使用字符串的例子:
printf("This is a string.");
printf("This is on\ntwo lines!");
printf("For \" you write \\\".");
复制代码
输出结果为:
This is a string.This is on
two lines!For " you write \".
复制代码
必须把字符串中的双引号写为转义序列",因为编译器会把双引号看做字符串的结尾。要在字符串中包含反斜杠,也必须使用转义序列\,因为字符串中的反斜杠总是表示转义序列的开头,其他的特殊符号也需要用到反斜杠,例如:\n,\t,\b等等。
每个字符串的末尾都添加了代码值为0的特殊字符,这个字符称为空字符,写为\0,C中的字符串总是由\0字符结束,所以字符串的长度永远比字符串中的字符数多1.
空字符不要和NULL混淆,空字符是字符串的结尾,而NULL是一个符号,表示不引用任何内容的内存地址。
2.存储字符串的变量
C根本没有字符串变量,也没有处理字符串的特殊运算符。
但是我们可以使用char类型的数组保存字符串。
char saying[20];
复制代码
声明存储字符串的数组时,其大小至少要比所存储的字符数多1,因为编译器会自动在字符串常量的末尾添加\0。
也可以这样声明初始化字符串变量
char saying[]= "This is a string";
复制代码
编译器会制定一个足以容纳这个初始化字符串常量的数值。
要引用存储在数组中的字符串时,只需使用数组名即可。
字符串数组
可以使用char类型的二维数组存储字符串,数组的每一行都用来存储一个字符串,这样,就可以存储一整串字符串,通过一个变量名来引用它们。例如:
char saying[3][32] = {"Manners maketh man","Many hands make light work.","Too many cooks spoil the broth."};
复制代码
这条语句创建了一个数组,它包含三行,每行32个字符,括号中的字符串按顺序指定数组的3行saying[0],saying[1]和saying[2],第一维指定数组可以包含的字符串个数,第二位指定32,刚好能容纳最长的字符串。
字符串操作
检查对C11的支持
根据C11标准实现可选函数的编译器,会定义_STDC_LIB_EXT1_符号,可以根据这个来判断是否支持C11,例如:
#include<stdio.h>
int main(void){#if defined _STDC_LIB_EXT1_printf("支持C11标准");#elseprintf("不支持C11标准");#endifreturn 0;
}
复制代码
要使用string.h中的可选函数,必须在string.h的include语句之前,在源文件中定义_STDC_WANT_LIB_EXT1_符号,来表示值1,如果没有吧这个符号定义为1,就只能使用字符串处理函数的标准集合。
确定字符串的长度
strlen_s()函数返回字符串的长度,需要两个参数:字符串的地址(这是一维数组的数组名)和数组的大小。知道数组的大小,若字符串没有结尾的\0字符,函数就可以避免访问最后一个元素后面的内存。
该函数把字符串的长度返回一个size_t类型的整数值,如果第一个参数是NULL,则返回0.如果在第二个参数值的元素个数中,第一个参数指定的数组不包含\0字符,就返回第二个参数值,作为字符串的长度。
确定字符串长度的标准函数是strlen(),它只把字符串的地址作为参数,若字符串没有\0,这个函数会越过字符串的末尾。
复制字符串
strcpy_s()函数可以吧一个字符串变量的内容赋予另一个字符串。它的第一个参数指定复制目标,第二个参数是一个整数,指定第一个参数的大小,第三个参数是源字符串。指定目标字符串的长度,可以使函数避免覆盖目标字符串中最后一个字符后面的内存,如果源字符串比目标字符串长,就会发生这种情形。如果一切正常就返回0,否则就返回非0 的整数值。下面是使用这个函数例子:
char source[]= "Only the mediocre are always at their best.";
char destination[50];
if(strcpy_s(destination,sizeof(destination),source)){printf("An error occurred copying the string!");
}
复制代码
标准复制函数是strcpy(),它会把第二个参数指定的字符串复制到第一个参数指定的位置上,不检查目标字符串的容量。
strncpy_s()
连接字符串
连接是把一个字符串连接到另一个字符串的尾部。
连接字符串时组要注意两点:
- 目标字符串的可用空间是否足够,不会覆盖其他数据,甚至代码
- 连接得到的字符串末尾要有\0字符。
strcat_s();这个函数需要三个参数:要添加新字符串的字符串地址,第一个参数可用存储的最大字符串长度,要添加到第一个参数中的字符串地址。该函数把一个整数错误码返回errno_t类型的值,它是一个取决于编译器的整数类型。
(上图中间应该是 "字符串str1和str2连接在一起")
比较字符串
比较两个字符串是基于它们的字符码。 函数strcmp(str1,str2)比较两个字符串,返回一个小于、等于或大于0的int值,分别对应于str1小于、等于或大于str2. 函数strncmp(str1,str2,num)可以比较两个字符串的前n个字符。
搜索字符串
- 指针的概念
C提供了一个非常有用的变量类型,叫做指针。指针是含有地址的变量,它含有内存中另一个包含数值的位置的引用。
int number = 25;
int * pNumber= &number;
复制代码
第二条语句就定义了一个指针。使用指针获取number的值就是:*pNumber;
*是取消引用运算符,起作用是访问指针指定的地址中存储的数据。
搜索字符串中的一个字符 函数strchr()在字符串中搜索给定的字符,它的第一个参数是要搜索的字符串,第二个参数是要查找的字符。返回的是在字符串中找到的第一个给定字符的地址,这是一个在内存中的地址,其类型为char * ,表示"char的指针",要存储这个值,必须创建一个能存储字符地址的变量,如果没有找到给定的字符,就会返回NULL,它相当于0,表示这个指针没有指向任何对象。
函数strrchr()用法和strchr()一样,但是这个函数是从字符串的尾部开始查找。在字符串中查找子字符串 strstr():它查找一个字符串中的子字符串,返回找到的第一个子字符串的位置指针。如果找不到匹配的子字符串,就返回NULL。第一个参数是要搜索的字符串,第二个参数是要查找的子字符串。
gets_s()函数可以读取键盘输入的一串字符。需要两个参数,第一个是数组的地址,第二个参数是数组的大小。 fgets()函数可以在输入的字符串中存储换行符,来结束输入过程。
C语言入门经典读书笔记 ----第六章 字符串和文本的应用相关推荐
- 《Perl语言入门》读书笔记(六)哈希
1.哈希特点 哈希是一种数据结构,与数组相同点,能容纳任意多的值:而哈希的检索方式与数组不同.数组是以数字下标检索,而哈希中的值(value)以唯一的名字(key)检索. key-value一一对应: ...
- R语言acres92 region_《R语言实战》读书笔记-- 第六章 基本图形
首先写第二部分的前言. 第二部分用来介绍获取数据基本信息的图形技术和统计方法. 本章主要内容 条形图.箱型图.点图 饼图和扇形图 直方图和核密度图 分析数据第一步就是要观察它,用可视化的方式是最好的. ...
- python cook读书笔记第2章字符串和文本
使用多个界定符分割字符串 line = 'asdf fjdk; afed, fjek,asdf, foo' import re # line = re.split(r'[;,\s]\s*',line) ...
- 《Python从入门到实践》读书笔记——第六章 字典
<Python从入门到实践>读书笔记--第六章 字典 1. 一个简单的字典 alien_0 = {'color': 'green', 'points': 5}print(alien_0[' ...
- 《Go语言圣经》学习笔记 第六章 方法
<Go语言圣经>学习笔记 第六章 方法 目录 方法声明 基于指针对象的方法 通过嵌入结构体来扩展类型 方法值和方法表达式 示例:Bit数组 封装 注:学习<Go语言圣经>笔记, ...
- 《Java编程思想》读书笔记 第十三章 字符串
<Java编程思想>读书笔记 第十三章 字符串 不可变String String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创建一个全新的String对象,以及包含修 ...
- 《C++ Primer》读书笔记—第六章 函数
声明: 文中内容收集整理自<C++ Primer 中文版 (第5版)>,版权归原书所有. 学习一门程序设计语言最好的方法就是练习编程 一.函数基础 1.一个典型的函数定义包括以下内容:返回 ...
- 《Microsoft Sql server 2008 Internals》读书笔记--第六章Indexes:Internals and Management(3)
<Microsoft Sql server 2008 Internals>读书笔记订阅地址: http://www.cnblogs.com/downmoon/category/230397 ...
- Entity Framework 4 in Action读书笔记——第六章:理解实体的生命周期(三)
objectstatemanager更改跟踪管理 ObjectStateManager组件(从现在开始称之为 state manager)负责与上下中对象追踪有关的一切: 1.当添加,附加到上下文或者 ...
最新文章
- 鸿蒙生死印里的声音是谁,逆天邪神:喊逆玄的确实是黎娑,鸿蒙生死印应该也是活物...
- MVC框架内容-视图
- WebRTC的拥塞控制技术转
- 皮一皮:直男表示,有钱女人的世界完全不懂...
- SAP:2019年会有多么不一样?
- 不让自己的应用程序在桌面的图标列表里启动显示的方法
- matlab 矩阵jocobi迭代_第6章 解线性方程组的迭代法(基于MATLAB)
- u-boot的patch文件制作
- gitlab protected branch
- Synchronized的底层实现原理(看这篇就够了)
- 关于axure 8在发布的时候显示:Unable to connect to Axure Share.的问题
- CSS 特异度、继承、求值过程简介
- GridView自带分页 1/总页数 首页 下一页 上一页 尾页 X 页 go 实现方法
- 斯巴达300勇士 中英文对照
- 520特别企划 | Z世代进入婚恋市场,婚恋交友行业会有什么变化?​
- 试读2-《白话C++ 练功篇》目录
- 名编辑电子杂志大师教程 | 设置目录
- 电信运营商基于 MQTT 协议 构建千万级 IoT 设备管理平台
- datastage服务器项目nls安装,datastagedads - 图文
- 单片机方案|口袋秤芯片方案
热门文章
- tf.cast() 张量数据类型转换
- Nativefier 网页转桌面程序 app
- 快速目标检测--Object detection at 200 Frames Per Second
- 图像拼接--Fish-Eye Lenses-Based Camera Calibration and Panoramic Image Stitching
- 级联人脸检测--Detecting Faces Using Inside Cascaded Contextual CNN
- ASP.NET Core Web Razor Pages系列教程七: 添加新的字段
- 手表后盖怎么装回去_链条掉了怎么装回去
- php在线运行1003php在线运行,php中文网
- liunx tar安装mysql_在Linux下,安装Mysql(tar)
- mysql子查询复杂操作_MySQL 子查询操作