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语言入门经典读书笔记 ----第六章 字符串和文本的应用相关推荐

  1. 《Perl语言入门》读书笔记(六)哈希

    1.哈希特点 哈希是一种数据结构,与数组相同点,能容纳任意多的值:而哈希的检索方式与数组不同.数组是以数字下标检索,而哈希中的值(value)以唯一的名字(key)检索. key-value一一对应: ...

  2. R语言acres92 region_《R语言实战》读书笔记-- 第六章 基本图形

    首先写第二部分的前言. 第二部分用来介绍获取数据基本信息的图形技术和统计方法. 本章主要内容 条形图.箱型图.点图 饼图和扇形图 直方图和核密度图 分析数据第一步就是要观察它,用可视化的方式是最好的. ...

  3. python cook读书笔记第2章字符串和文本

    使用多个界定符分割字符串 line = 'asdf fjdk; afed, fjek,asdf, foo' import re # line = re.split(r'[;,\s]\s*',line) ...

  4. 《Python从入门到实践》读书笔记——第六章 字典

    <Python从入门到实践>读书笔记--第六章 字典 1. 一个简单的字典 alien_0 = {'color': 'green', 'points': 5}print(alien_0[' ...

  5. 《Go语言圣经》学习笔记 第六章 方法

    <Go语言圣经>学习笔记 第六章 方法 目录 方法声明 基于指针对象的方法 通过嵌入结构体来扩展类型 方法值和方法表达式 示例:Bit数组 封装 注:学习<Go语言圣经>笔记, ...

  6. 《Java编程思想》读书笔记 第十三章 字符串

    <Java编程思想>读书笔记 第十三章 字符串 不可变String String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创建一个全新的String对象,以及包含修 ...

  7. 《C++ Primer》读书笔记—第六章 函数

    声明: 文中内容收集整理自<C++ Primer 中文版 (第5版)>,版权归原书所有. 学习一门程序设计语言最好的方法就是练习编程 一.函数基础 1.一个典型的函数定义包括以下内容:返回 ...

  8. 《Microsoft Sql server 2008 Internals》读书笔记--第六章Indexes:Internals and Management(3)

    <Microsoft Sql server 2008 Internals>读书笔记订阅地址: http://www.cnblogs.com/downmoon/category/230397 ...

  9. Entity Framework 4 in Action读书笔记——第六章:理解实体的生命周期(三)

    objectstatemanager更改跟踪管理 ObjectStateManager组件(从现在开始称之为 state manager)负责与上下中对象追踪有关的一切: 1.当添加,附加到上下文或者 ...

最新文章

  1. 鸿蒙生死印里的声音是谁,逆天邪神:喊逆玄的确实是黎娑,鸿蒙生死印应该也是活物...
  2. MVC框架内容-视图
  3. WebRTC的拥塞控制技术转
  4. 皮一皮:直男表示,有钱女人的世界完全不懂...
  5. SAP:2019年会有多么不一样?
  6. 不让自己的应用程序在桌面的图标列表里启动显示的方法
  7. matlab 矩阵jocobi迭代_第6章 解线性方程组的迭代法(基于MATLAB)
  8. u-boot的patch文件制作
  9. gitlab protected branch
  10. Synchronized的底层实现原理(看这篇就够了)
  11. 关于axure 8在发布的时候显示:Unable to connect to Axure Share.的问题
  12. CSS 特异度、继承、求值过程简介
  13. GridView自带分页 1/总页数 首页 下一页 上一页 尾页 X 页 go 实现方法
  14. 斯巴达300勇士 中英文对照
  15. 520特别企划 | Z世代进入婚恋市场,婚恋交友行业会有什么变化?​
  16. 试读2-《白话C++ 练功篇》目录
  17. 名编辑电子杂志大师教程 | 设置目录
  18. 电信运营商基于 MQTT 协议 构建千万级 IoT 设备管理平台
  19. datastage服务器项目nls安装,datastagedads - 图文
  20. 单片机方案|口袋秤芯片方案

热门文章

  1. tf.cast() 张量数据类型转换
  2. Nativefier 网页转桌面程序 app
  3. 快速目标检测--Object detection at 200 Frames Per Second
  4. 图像拼接--Fish-Eye Lenses-Based Camera Calibration and Panoramic Image Stitching
  5. 级联人脸检测--Detecting Faces Using Inside Cascaded Contextual CNN
  6. ASP.NET Core Web Razor Pages系列教程七: 添加新的字段
  7. 手表后盖怎么装回去_链条掉了怎么装回去
  8. php在线运行1003php在线运行,php中文网
  9. liunx tar安装mysql_在Linux下,安装Mysql(tar)
  10. mysql子查询复杂操作_MySQL 子查询操作