[RISC-V MCU 应用开发] C语言的字符数组与字符串

[复制链接]
 楼主| AdaMaYun 发表于 2024-3-12 09:13 | 显示全部楼层 |阅读模式
1、字符数组的定义与初始化
字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。char str[10]={ 'I',' ','a','m',' ',‘h','a','p','p','y'};

即把10个字符分别赋给str[0]到str[9]10个元素

如果花括号中提供的字符个数大于数组长度,则按语法错误处理;若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 '\0' )。



2、字符数组与字符串
在c语言中,将字符串作为字符数组来处理。(c++中不是)

在实际应用中人们关心的是有效字符串的长度而不是字符数组的长度,例如,定义一个字符数组长度为100,而实际有效字符只有40个,为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”,以字符'\0'代表。如果有一个字符串,其中第10个字符为'\0',则此字符串的有效字符为9个。也就是说,在遇到第一个字符'\0'时,表示字符串结束,由它前面的字符组成字符串。

系统对字符串常量也自动加一个'\0'作为结束符。例如char str[ ]={"I am happy"};

可以省略花括号,如下所示

  1. char str[ ]="I am happy";


注意:上述这种字符数组的整体赋值赋值,字符数组的赋值只能对其元素一一赋值,下面的赋值方法是错误的

char str[ ];
str="I am happy";


不是用单个字符作为初值,而是用一个字符串(注意:字符串的两端是用双引号“”而不是单引号‘'括起来的)作为初值。显然,这种方法更直观方便。(注意:数组str的长度不是10,而是11,这点请务必记住,因为字符串常量"I am happy"的最后由系统自动加上一个'\0')

因此,上面的初始化与下面的初始化等价

  1. char str[ ]={'I',' ','a','m',' ','h','a','p','p','y','\0'};

而不与下面的等价

  1. char str[ ]={'I',' ','a','m',' ','h','a','p','p','y'};


前者的长度是11,后者的长度是10. 说明:字符数组并不要求它的最后一个字符为'\0',甚至可以不包含'\0',向下面这样写是完全合法的。

  1. char str[5]={'C','h','i','n','a'};


可见,用两种不同方法初始化字符数组后得到的数组长度是不同的。

  1. #include <stdio.h>
  2. void main(void)
  3. {
  4. char c1[]={'I',' ','a','m',' ','h','a','p','p','y'};
  5. char c2[]="I am happy";
  6. int i1=sizeof(c1);
  7. int i2=sizeof(c2);
  8. printf("%d\n",i1);
  9. printf("%d\n",i2);
  10. }

结果:10   11



 楼主| AdaMaYun 发表于 2024-3-12 09:13 | 显示全部楼层
3、字符串的表示形式
在C语言中,可以用两种方法表示和存放字符串:

用字符数组存放一个字符串
字符指针指向一个字符串
C语言对字符串常量是按字符数组处理的,在内存中开辟了一个字符数组用来存放字符串常量,程序在定义字符串指针变量str时存放字符串的字符数组的首地址)赋给str。

两种表示方式的字符串输出都用

  1. printf("%s\n",str);


%s表示输出一个字符串,给出字符指针变量名str(对于第一种表示方法,字符数组名即是字符数组的首地址,与第二种中的指针意义是一致的),则系统先输出它所指向的一个字符数据,然后自动使str自动加1,使之指向下一个字符...,如此,直到遇到字符串结束标识符 " \0 "。

亚瑟 发表于 2024-3-14 17:10 来自手机 | 显示全部楼层
c语言里这俩一样吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

299

主题

2492

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部