字符串是连续的字符序列,最后以空字符'\0'作为终止符。一个字符串的长度指所有字符的数量,但不包括终止符。在 C 语言中,没有字符串类型,自然也就没有运算符以字符串为操作数。

字符串被存储在元素类型为 char 或宽字符类型数组中(宽字符类型指 wchar_t、char16_t 或 char32_t)。宽字符组成的字符串也称为宽字符串(wide string)。

C 标准库提供了大量的函数,它们可以对字符串进行基本操作,例如字符串的比较、复制和连接等。在这些传统的字符串函数以外,C11 新增了这些函数的“安全”版本,它们能确保字符串操作不会超出数组的边界。

可以使用字符串字面量来初始化任何字符类型数组。例如,下面两个数组的定义是等价的:

char str1[30] = "Let's go"; // 字符串长度:8;数组长度:30

char str1[30] = { 'L', 'e', 't', '\'', 's',' ', 'g', 'o', '\0' };

存储字符串的数组一定比字符串长度多一个元素,以容纳下字符串终止符(空字符'\0')。因此,str1 数组能够存储的字符串最大长度是 29。如果定义数组长度为 8,而不是 30,就会发生错误,因为它无法包含字符串终止符。

如果在定义一个字符数组时,没有显式地指定长度,但使用了字符串字面量来对它进行初始化,该数组的长度会比字符串长度多 1。如下列所示:

char str2[] = " to London!"; // 字符串长度:11 (注意开头的空格);

// 数组长度:12

下面的语句使用标准函数 strcat()把字符串 str2 附加到字符串 str1 的后面(str1 数组长度必须足够大以容纳连接后的全部字符)。

#include

char str1[30] = "Let's go";

char str2[ ] = " to London!";

/* ... */

strcat( str1, str2 );

puts( str1 );

调用 puts()后,输出新的 str1 数组内容:

Let's go to London!

str1 和 str2 的名字其实是两个指针,它们指向各自数组的第一个字符。这样的指针被称为指向字符串的指针(pointer to a string),或者简称为字符串指针(string pointer)。

字符串处理函数(例如 scrcat()和 puts())需要接收字符串起始地址并将其作为参数。这样的函数通常逐个字符地处理字符串,直到遇到结尾终止符'\0'为止。

例 1 是函数 strcat()的另——种可能的实现方式。它采用从函数参数传入的指针遍历处理整个字符串。

【例1】函数 strcat()

// 函数strcat() 将第二个字符串复制一份并附加到第一个字符串的尾部

// 参数:指向两个字符串的指针

// 返回值:指向第一个字符串的指针,此时已将第二个字符串连接到了其尾部

char *strcat( char * restrict s1, const char * restrict s2 )

{

char *rtnPtr = s1;

while ( *s1 != '\0' ) // 找到字符串s1的尾部

++s1;

while (( *s1++ = *s2++ ) != '\0' ) // 将s2的首字符替换掉s1的终止符

;

return rtnPtr;

}

以 s1 地址为起始位置的 char 数组,其长度至少是两个字符串长度的和再加上 1,以容纳字符串终止符。在调用 strcat()之前,可以采用标准函数 strlen()进行测试,以确保长度没有问题,函数 strlen()返回其字符串参数的长度,如下所示:

if ( sizeof(str1) >= ( strlen( str1 ) + strlen( str2 ) + 1 ) )

strcat( str1, str2 );

宽字符串字面量会加上一个前缀 L、u 或 U,它们是宽字符串的标志。因此,wchar_t 数组的初始化过程如下所示:

#include // 定义wchart_t类型

/* ... */

wchar_t dinner[] = L"chop suey"; // 字符串长度:10;

// 数组长度:11;

// 数组空间大小:11 * sizeof(wchar_t)

c语言是否所有的字符串都有终止符,C语言字符串数组相关推荐

  1. c语言讨论学,看看大家都是如何谈论C语言的

    看看大家都是如何谈论C语言的 C语言是我们关注最多的一门学科,同时也是最让我们提心吊胆,担惊受怕的学科.下面让我们一起来看看大家都是怎么看待C语言的吧! 1. C语言是我们关注最多的一门学科,同时也是 ...

  2. c语言中 字符串常量的界定符,c语言题库2

    分源程序给出如下.请勿改动主函数main和其 它函数中的任何内容,仅在函数fun的花括号中填 入所编写的若干语句. ------------------------------------------ ...

  3. python中的换行符是哪个键_对Python字符串中的换行符和制表符介绍

    对Python字符串中的换行符和制表符介绍 有关换行的问题 首先提一个问题,如下. python程序代码如下: print("I'm Bob. What's your name?" ...

  4. python语言编程入门先学什么-初学者先学习python语言还是C语言

    有人觉得应该从C语言开始入门,原因如下: 1.C语言是你上大学第一门接触的编程语言,可见它的重要性. 2.C语言是一种面向过程的语言,而Python是一种面向对象的解释型计算机程序设计语言.而你需要先 ...

  5. NLP:对字符串按照一个、多个自定义分隔符进行分割、将列表转为字符串同时自定义连接符

    NLP:对字符串按照一个.多个自定义分隔符进行分割.将列表转为字符串同时自定义连接符 目录 对字符串按照一个.多个自定义分隔符进行分割 将列表转为字符串同时自定义连接符 对字符串按照一个.多个自定义分 ...

  6. 任何字符串都可以作为c语言的标识符,2013年软考程序员模拟试题及答案解析一...

    2013年软考网络工程师.IT项目管理师考前培训可进入 一.选择题 1.二进制语言是属于( ) A.面向机器语言 B.面向问题语言 C.面向过程语言 D.面向汇编语言 [解析]人们研制了许许多多计算机 ...

  7. java 常量字符串过长_90%的同学都没搞清楚的 Java 字符串常量池问题(图文并茂)

    字符串问题可谓是 Java 中经久不衰的问题,尤其是字符串常量池经常作为面试题出现.可即便是看似简单而又经常被提起的问题,还是有好多同学一知半解,看上去懂了,仔细分析起来却又发现不太明白. 背景说明 ...

  8. c语言申请字符串动态,【分享】C语言动态长度字符串

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 很多朋友都用惯了高级语言的字符串变量,就是定义一个字符串变量,直接可以赋值,但在C语言里没有字符串变量这样的概念,只有字符数组,因此,只能定义一个固定数组 ...

  9. PAT甲级1016 Phone Bills :[C++题解]字符串处理(复杂题)(C语言格式化读入、输出很便利!!!)

    文章目录 题目分析 题目链接 题目分析 原题: 长途电话公司按以下规则向客户收费: 拨打长途电话每分钟要花费一定的费用,具体收费取决于拨打电话的时间. 客户开始拨打长途电话的时间将被记录,客户挂断电话 ...

最新文章

  1. 关于子业之间相互取得元素或者方法
  2. Swift3.0语言教程使用指针创建和初始化字符串
  3. Nginx的启动、停止与重启---linux
  4. Oracle-Listener log解读
  5. java字符串切割_java字符串常用操作方法(查找、截取、分割)
  6. 使用input type=file 上传文件时需注意
  7. 【转】Postman系列五:Postman中电商网站cookie、token检验与参数传递实战
  8. Java原子类中CAS的底层实现,java高级面试笔试题
  9. eclipse mysql jndi_裴东辉-MyEclipse和Eclipse中使用JNDI来配置程序的开发,以及服务器的配置 - 裴东辉...
  10. ELK下filebeat性能调优
  11. bzoj 1019: [SHOI2008]汉诺塔(打表)
  12. c# 扩展方法奇思妙用高级篇三:Enumerable.CastT 应用
  13. 计算机房 噪声 标准,机房的噪音检测标准及治理方法
  14. php 验证手机号规则,PHP最完整的验证手机号码
  15. linux内核无锁cas,无锁编程以及CAS
  16. MongoDB实战(MongoDB开发者现身说法)
  17. 如何root安卓手机_超级神器——安卓端的手机虚拟机,手机中的手机(支持root,xp框架)...
  18. oracle12c 配置监听,redhat上oracle 12c配置监听
  19. pwm一个时间单位_详解PWM原理、频率与占空比
  20. python socket编程 实现简单p2p聊天程序

热门文章

  1. bat 安装zabbix agent
  2. ArcGIS教程:什么是经验贝叶斯克里金法?
  3. java生日快乐代码手机端,程序员如何用代码祝自己生日快乐(多用模板)
  4. 微波炉定时c语言程序,美的微波炉定时器的检测
  5. 中国报表-报表工具-智业智能-2009年一季度报表工具动向(三)
  6. StarCCM+的jar包路径
  7. 【30分钟学完】canvas动画|游戏基础(4):边界与碰撞
  8. CF实时估分软件——CF-Predictor
  9. 扑克牌输赢判断系统(景驰18年秋招第一题)
  10. linux中磁盘分区fdisk,管理磁盘分区之fdisk详解