今天看到字符串和指针,想到还有字符串没有介绍,字符串在C语言中属于细节之类,非常值得大家认真学习,细节决定成败嘛。并且在学习字符串后,还会有字符串函数需要介绍。
字符串简介
首先我们来看看维基百科对字符串的定义:
字符串(英语:string),是由零个或多个字符组成的有限序列。它是编程语言中表示文本的数据类型。
通常以串的整体作为操作对象,如:在串中查找某个子串、求取一个子串、在串的某个位置上插入一个子串以及删除一个子串等。两个字符串相等的充要条件是:长度相等,并且各个对应位置上的字符都相等。设p、q是两个串,求q在p中首次出现的位置的运算叫做模式匹配。串的两种最基本的存储方式是顺序存储方式和链接存储方式。
在C语言中,char类型可以表示单个字符,用字符串表示字符序列。而字符串是一种字符串形式,即用双引号把字符括起来。如:“hello,Bob".可以把字符串存储在字符数组(由内存中相邻的字节组成)中。
字符串,无论是表示成字符常量还是存储在字符数组中,都以一个叫空字符的隐藏字符结尾。
字符串的形式理论
设 Σ 是叫做字母表的非空有限集合。Σ 的元素叫做“符号”或“字符”。在 Σ 上的字符串(或字)是来自 Σ 的任何有限序列。例如,如果 Σ = {0, 1},则 0101 是在 Σ 之上的字符串。
字符串的长度是在字符串中字符的数目(序列的长度),它可以是任何非负整数。“空串”是在 Σ 上的唯一的长度为 0 的字符串,并被指示为 ε 或 λ。
在 Σ 上的所有长度为 n 的字符串的集合指示为 Σn。例如,如果 Σ = {0, 1} 则 Σ2 = {00, 01, 10, 11}。注意 Σ0 = {ε} 对于任何字母表 Σ。
在 Σ 上的所有任何长度的字符串的集合是 Σ 的Kleene闭包并被指示为 Σ*。依据Σn, 。例如,如果 Σ = {0, 1} 则 Σ* = {ε, 0, 1, 00, 01, 10, 11, 000, 001, 010, 011, …}。尽管 Σ* 自身是可数无限的,Σ* 的所有元素都有有限长度。
在 Σ 上一个字符串的集合(就是 Σ* 的任何子集)被称为在 Σ 上的形式语言。例如,如果 Σ = {0, 1},则带有偶数个零的字符串的集合({ε, 1, 00, 11, 001, 010, 100, 111, 0000, 0011, 0101, 0110, 1001, 1010, 1100, 1111, …})是在 Σ 上的形式语言。
串接和子串
“串接”(英语:concatenation)是Σ*上的重要二元运算。对于Σ*中的两个字符串s和t,它们的串接被定义为在s中的字符序列之后跟随着t中的字符序列,并被指示为st。例如,Σ = {a, b,…, z},并且s = bear且t = hug,则st = bearhug而ts = hugbear。
字符串串接是结合性的,但非交换性运算。空串充当单比特;对于任何字符串s,有εs = sε = s。所以,集合Σ*和串接运算形成了幺半群,就是从Σ生成的自由幺半群。此外,长度函数定义了一个从Σ*到非负整数的幺半群同态。
字符串s被称为是字符串t的“子串”(英语:substring)或“因子”(英语:factor),如果存在(可能为空)字符串u和v使得t = usv。“是其子串”关系定义了在Σ*上的偏序,其最小元是空串。
字符串的知识需要大家多看,多记,多用。更详细的内容还在后头哦。
学习前人是承前启后,超越前人是推陈出新。