C语言字符串数组详解

 更新时间:2021年8月14日 16:00  点击:2257

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 <string.h>
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 <stddef.h>                        // 定义wchart_t类型
/* ... */
wchar_t dinner[] = L"chop suey";        // 字符串长度:10;
                                                // 数组长度:11;
                                                // 数组空间大小:11 * sizeof(wchar_t)

到此这篇关于C语言字符串数组详解的文章就介绍到这了,更多相关C语言字符串数组内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

[!--infotagslink--]

相关文章

  • C语言实现放烟花的程序

    这篇文章主要为大家详细介绍了C语言实现放烟花的程序,有音乐播放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-23
  • C语言中的字符(char)详细讲解

    本篇文章主要介绍C语言中char的知识,并附有代码实例,以便大家在学习的时候更好的理解,有需要的可以看一下...2020-04-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • c#中判断字符串是不是数字或字母的方法

    这篇文章介绍了C#判断字符串是否数字或字母的实例,有需要的朋友可以参考一下...2020-06-25
  • Python 图片转数组,二进制互转操作

    这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • PostgreSQL判断字符串是否包含目标字符串的多种方法

    这篇文章主要介绍了PostgreSQL判断字符串是否包含目标字符串的多种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-23
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • 详解如何将c语言文件打包成exe可执行程序

    这篇文章主要介绍了详解如何将c语言文件打包成exe可执行程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-25
  • php数组操作 键名比较 差集 交集赋值

    本文章提供在量的数据中级操作实例有如对键名比较计算数组的差集 计算差集 给指定数组中插入一个元素 反转数组 交集赋值新的数组实例。 //定义回调函数 funct...2016-11-25
  • php字符串按照单词逐个进行反转的方法

    本文实例讲述了php字符串按照单词进行反转的方法。分享给大家供大家参考。具体分析如下:下面的php代码可以将字符串按照单词进行反转输出,实际上是现将字符串按照空格分隔到数组,然后对数组进行反转输出。...2015-03-15
  • C#二维数组基本用法实例

    这篇文章主要介绍了C#二维数组基本用法,以实例形式分析了C#中二维数组的定义、初始化、遍历及打印等用法,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C#数组的常用操作方法小结

    Array数组在C#中同样是最基本的数据结构,下面为大家C#数组的常用操作方法小结,皆为细小的代码段,欢迎收看收藏...2020-06-25
  • php curl模拟post请求和提交多维数组的示例代码

    下面一段代码给大家介绍php curl模拟post请求的示例代码,具体代码如下: <&#63;php$uri = "http://www.cnblogs.com/test.php";//这里换成自己的服务器的地址// 参数数组$data = array ( 'name' => 'tanteng'// 'passwor...2015-11-24
  • 使用list stream: 任意对象List拼接字符串

    这篇文章主要介绍了使用list stream:任意对象List拼接字符串操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-09
  • MySQL 字符串拆分操作(含分隔符的字符串截取)

    这篇文章主要介绍了MySQL 字符串拆分操作(含分隔符的字符串截取),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-22
  • C# 16 进制字符串转 int的方法

    这篇文章主要介绍了C# 16 进制字符串转 int的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 获取中文字符串的实际长度代码

    JS中默认中文字符长度和其它字符长度计算方法是一样的,但某些情况下我们需要获取中文字符串的实际长度,代码如下: 复制代码 代码如下: function strLength(str) { var realLength = 0, len = str.length, charCode = -1;...2014-06-07
  • C# 拷贝数组的几种方法(总结)

    下面小编就为大家带来一篇C# 拷贝数组的几种方法(总结)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • PHP 二维数组根据某个字段排序的具体实现

    本文记录的要实现的功能类似于 MySQL 中的 ORDER BY,上个项目中有遇到这样的一个需求。 要求:从两个不同的表中获取各自的4条数据,然后整合(array_merge)成一个数组,再根据数据的创建时间降序排序取前4条。 遇到这个...2014-06-07