栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【c语言】字符串及其字符串函数1

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【c语言】字符串及其字符串函数1

一、字符串的相关概念
  1. 字符串:是以空字符()结尾的char类型数组。

  2. 字符串字面量:

    • 用双引号括起来的内容叫做字符串字面量,也称为字符串常量。编译器会在双引号中的字符后面自动加上空字符,将其作为字符串一起储存在内存中。

      若是没有’’,则只表示由字符构成的数组,而非字符串数组。

    • 若字符串字面量之间没有间隔,或用空白字符分隔,C会将其自动视为串联起来的字符串字面量。如"Hello"“! How are” "you?"与"Hello! How are you?"等价。

    • 若是在字符串内部要使用双引号,则需要加上转义字符反斜杠()。

    • 字符串常量是静态存储类别,在函数中字符串只会被存储一次,但可以被调用多次。

    • 用双引号括起来的内容,被视为指向该字符串的指针,即首字符的地址,类似于把数组名作为指向该数组首地址的指针,如下面程序:

      #include 
      int main()
      {
        printf("%s, %p, %cn", "We", "are", *"space farers");
        
        return 0;
      }
      

      %s打印字符串We;%p打印"are"的首字符地址;%c打印“space farers”指向的地址存储的字符,即首字符s。故最后的输出是:

      We, 0x100000f61, s

二、字符串数组及其初始化

定义字符串数组时,必须要让编译器知道需要分配多少空间。

下面是用指定的字符串初始化数组m1:

const char m1[10] = "Hello";

const表示不会更改这个字符串。

也可用以下方法初始化字符串,但是较为麻烦:

const char m1[10] = {'H', 'e', 'l', 'l', 'o', ''};

且该方法一定要在后面加上’’,才能作为字符串使用,否则只是字符数组。

在指定数组大小的时候,为了容纳空字符,要确保数组的元素个数至少要比字符串长度多1。所有未被使用的空间(多出来的未使用的内存)都会被自动初始化为’’。

我们也可以像数组一样,省略初始化声明中的大小。编译器会通过查找字符串末尾的空字符,自动计算字符串数组的大小,如:

const char m2[] = "if you can't think of anything, fake it."

但该方法不能之后在填充内容,若要创建一个稍后再填充的数组,就必须在声明时指定大小。

因为字符串数组名和其他数组名一样,是首元素的地址,故有以下初始化:

char car[10] = "Tata";


我们也可以采用指针表示法创建字符串。如下面两种声明:

const char * pt1 = "Something is pointing at me."; //指针形式
const char ar1[] = "something is pointing at me."; //数组形式

pr1和ar1都表示该字符串的首地址,带双引号的字符串本身决定预留给字符串的存储空间。但其两种方法仍有一定区别。

三、数组形式和指针形式的区别

简单来说,初始化数组是把静态存储区的字符串拷贝到数组中,初始化指针是把静态存储区的字符串首地址拷贝给指针。

  1. 初始化指针:

    可以改变pt1指针的指向,如:

    const char * pt1 = "Something is pointing at me."; //指针形式
    char * pt2 = "Hello!";
      
    pt1 = pt2;
    

    将pt1的指向从"Something is pointing at me."的首地址,转向了"Hello!"的首地址。

    也可以通过pt1+1或者++pt1改变指针在同一个字符串中,指向不同的字符。

    但由于初始化指针只是将首地址拷贝给指针,其字符串只存储在静态存储区的,所以不能修改pt1所指向的字符串数组的内容,如下程序,是错误的。

    *pt1 = 'W' //错误
    
  2. 初始化数组:

    字符串存储在静态存储区中,当程序开始运行时,才会为数组分配内存,初始化数组是将静态存储区的字符串拷贝到数组中,此时字符串有两个副本,一个是在静态内存中的字符串常量,一个是存储在ar1数组中的字符串。

    此时,ar1是地址常量,不能更改ar1。运行执行ar1+1等操作,来标识下一个元素,并可以修改其内容,如下程序。但是不允许使用++ar1,因为该操作只能用于变量,而ar1是常量,只有指针形式可以进行递增操作。

    char str[] = "Hello";
    *(ptr + 1) = 'E';
    

    最后的字符串变更为“HEllo”。

综上,若要用数组表示一系列待显示的字符串,使用指针形式。若要改变字符串或为字符串输入预留空间,使用数组形式。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/942215.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号