c语言是否所有的字符串都有终止符,C语言字符串数组
字符串是连续的字符序列,最后以空字符'\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语言字符串数组相关推荐
- c语言讨论学,看看大家都是如何谈论C语言的
看看大家都是如何谈论C语言的 C语言是我们关注最多的一门学科,同时也是最让我们提心吊胆,担惊受怕的学科.下面让我们一起来看看大家都是怎么看待C语言的吧! 1. C语言是我们关注最多的一门学科,同时也是 ...
- c语言中 字符串常量的界定符,c语言题库2
分源程序给出如下.请勿改动主函数main和其 它函数中的任何内容,仅在函数fun的花括号中填 入所编写的若干语句. ------------------------------------------ ...
- python中的换行符是哪个键_对Python字符串中的换行符和制表符介绍
对Python字符串中的换行符和制表符介绍 有关换行的问题 首先提一个问题,如下. python程序代码如下: print("I'm Bob. What's your name?" ...
- python语言编程入门先学什么-初学者先学习python语言还是C语言
有人觉得应该从C语言开始入门,原因如下: 1.C语言是你上大学第一门接触的编程语言,可见它的重要性. 2.C语言是一种面向过程的语言,而Python是一种面向对象的解释型计算机程序设计语言.而你需要先 ...
- NLP:对字符串按照一个、多个自定义分隔符进行分割、将列表转为字符串同时自定义连接符
NLP:对字符串按照一个.多个自定义分隔符进行分割.将列表转为字符串同时自定义连接符 目录 对字符串按照一个.多个自定义分隔符进行分割 将列表转为字符串同时自定义连接符 对字符串按照一个.多个自定义分 ...
- 任何字符串都可以作为c语言的标识符,2013年软考程序员模拟试题及答案解析一...
2013年软考网络工程师.IT项目管理师考前培训可进入 一.选择题 1.二进制语言是属于( ) A.面向机器语言 B.面向问题语言 C.面向过程语言 D.面向汇编语言 [解析]人们研制了许许多多计算机 ...
- java 常量字符串过长_90%的同学都没搞清楚的 Java 字符串常量池问题(图文并茂)
字符串问题可谓是 Java 中经久不衰的问题,尤其是字符串常量池经常作为面试题出现.可即便是看似简单而又经常被提起的问题,还是有好多同学一知半解,看上去懂了,仔细分析起来却又发现不太明白. 背景说明 ...
- c语言申请字符串动态,【分享】C语言动态长度字符串
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 很多朋友都用惯了高级语言的字符串变量,就是定义一个字符串变量,直接可以赋值,但在C语言里没有字符串变量这样的概念,只有字符数组,因此,只能定义一个固定数组 ...
- PAT甲级1016 Phone Bills :[C++题解]字符串处理(复杂题)(C语言格式化读入、输出很便利!!!)
文章目录 题目分析 题目链接 题目分析 原题: 长途电话公司按以下规则向客户收费: 拨打长途电话每分钟要花费一定的费用,具体收费取决于拨打电话的时间. 客户开始拨打长途电话的时间将被记录,客户挂断电话 ...
最新文章
- 关于子业之间相互取得元素或者方法
- Swift3.0语言教程使用指针创建和初始化字符串
- Nginx的启动、停止与重启---linux
- Oracle-Listener log解读
- java字符串切割_java字符串常用操作方法(查找、截取、分割)
- 使用input type=file 上传文件时需注意
- 【转】Postman系列五:Postman中电商网站cookie、token检验与参数传递实战
- Java原子类中CAS的底层实现,java高级面试笔试题
- eclipse mysql jndi_裴东辉-MyEclipse和Eclipse中使用JNDI来配置程序的开发,以及服务器的配置 - 裴东辉...
- ELK下filebeat性能调优
- bzoj 1019: [SHOI2008]汉诺塔(打表)
- c# 扩展方法奇思妙用高级篇三:Enumerable.CastT 应用
- 计算机房 噪声 标准,机房的噪音检测标准及治理方法
- php 验证手机号规则,PHP最完整的验证手机号码
- linux内核无锁cas,无锁编程以及CAS
- MongoDB实战(MongoDB开发者现身说法)
- 如何root安卓手机_超级神器——安卓端的手机虚拟机,手机中的手机(支持root,xp框架)...
- oracle12c 配置监听,redhat上oracle 12c配置监听
- pwm一个时间单位_详解PWM原理、频率与占空比
- python socket编程 实现简单p2p聊天程序