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'作为结束符。例如"C Program”共有9个字符,但在内存中占10个字节,最后一个字节'0'是系统自动加上的。(通过sizeof()函数可验证)

有了结束标志'0'后,字符数组的长度就显得不那么重要了,在程序中往往依靠检测'0'的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度。当然,在定义字符数组时应估计实际字符串长度,保证数组长度始终大于字符串实际长度。(在实际字符串定义中,常常并不指定数组长度,如char str[ ])

说明:'n’代表ASCII码为0的字符,从ASCII码表中可以查到ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不干。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。

对C语言处理字符串的方法由以上的了解后,再对字符数组初始化的方法补充一种方法——即可以用字符串常量来初始化字符数组:

char str[ ]={"I am happy"}; 可以省略花括号,如下所示

char str[ ]="I am happy";

注意:上述这种字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值,字符数组的赋值只能对其元素一一赋值,下面的赋值方法是错误的

char str[ ];

str="I am happy";

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

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

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

而不与下面的等价

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

前者的长度是11,后者的长度是10.

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

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

++++++++

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

#include <stdio.h>

void main(void)
{
char c1[]={'I',' ','a','m',' ','h','a','p','p','y'};
char c2[]="I am happy";
int i1=sizeof(c1);
int i2=sizeof(c2);
printf("%dn",i1);
printf("%dn",i2);

}

结果:10 11

3、字符串的表示形式

在C语言中,可以用两种方法表示和存放字符串:

(1)用字符数组存放一个字符串

char str[ ]="I love China";

(2)用字符指针指向一个字符串

char* str="I love China";

对于第二种表示方法,有人认为str是一个字符串变量,以为定义时把字符串常量"I love China"直接赋给该字符串变量,这是不对的。

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

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

printf("%sn",str);

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

4、对使用字符指针变量字符数组两种方法表示字符串的讨论

虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈。

4.1、字符数组由若干个元素组成,每个元素放一个字符;而字符指针变量中存放的是地址(字符串/字符数组的首地址),绝不是将字符串放到字符指针变量中(是字符串首地址)

4.2、赋值方式:

对字符数组只能对各个元素赋值,不能用以下方法对字符数组赋值

char str[14];

str="I love China"; (但在字符数组初始化时可以,即char str[14]="I love China";)

而对字符指针变量,采用下面方法赋值:

char* a;

a="I love China";

或者是 char* a="I love China"; 都可以

4.3、对字符指针变量赋初值(初始化):

char* a="I love China";

等价于:

char* a;

a="I love China";

而对于字符数组的初始化

char str[14]="I love China";

不能等价于:

char str[14];

str="I love China"; (这种不是初始化,而是赋值,而对数组这样赋值是不对的)

4.4、如果定义了一个字符数组,那么它有确定的内存地址;而定义一个字符指针变量时,它并未指向某个确定的字符数据,并且可以多次赋值。

5、字符串处理函数

5.1

char *strcat(char *str1,const char *2 );

char *strcat(char *strDestination,const char *strSource );

功能:函数将字符串str2 连接到str1的末端,并返回指针str1

注:连接前两个字符串的后面都有一个' 0 ',连接时将字符串1后面的 ' 0 ‘去掉,只在新串最后保留一个 ' 0 ‘

5.2

char *strcpy(char *str1,const char *2 );

char *strcpy(char *strDestination,const char *strSource );

功能:复制字符串strSource中的字符到字符串strDestination,包括空值结束符。返回值为指针strDestination。

注:1、“字符数组1”必须写成数组名形式,“字符串2"可以是字符数组名,也可以是一个字符串常量

2、复制时连同字符串后面的 ' 0 ' 一起复制到数组1中

3、不能用赋值语句直接将一个字符串常量或者字符数组直接赋给一个字符数组(同普通变量数组是一样的),而只能用strcpy函数处理。

4、可以用strcpy函数将字符串2中的前若干个字符复制到字符数组1中去。

嵌入式物联网资料分享交流群:332650978 入群有全套学习视频资料电子书免费赠送!

参考资料:

物联网开发入门直播课 - 嵌入式/物联网-C语言编程基础​www.makeru.com.cnC语言_嵌入式​www.makeru.com.cn

嵌入式底层开发 - 夯实C语言,从小白到大牛的进阶之路!​www.makeru.com.cn

android 数组赋值字符串_c语言中的字符数组与字符串相关推荐

  1. C语言中关于字符数组输入,scanf没执行

    问题:有时C语言中关于字符数组输入,有的scanf语句没执行. 未执行scanf的代码: #include<stdio.h> int main() {int n;int t=0;scanf ...

  2. printf输出字符串_c语言入门 第十二章 字符串

    在c当中有一种数组是由char类型构成的,其中的元素都是字符,如果这个字符数组是以字符编码0('0'字符)结尾的,那么我们就叫这个字符数组为字符串 字符串的数据常量形式是使用双引号包围的字符序列 1 ...

  3. C语言中的字符函数和字符串函数

    目录 前言 1.常用函数介绍 1.1 strlen 1.2 stycpy 1.3 strcat 1.4 strcmp 1.5 strncpy 1.6 strncat 1.7 strncmp 1.8 s ...

  4. c语言数组和字符串编程题,C语言中的字符数组和字符串详解

    c语言字符数组和字符串: 1.存放字符的数组称为字符数组 char str[] 2.'\0'也被称为字符串结束标志 3.由" "包围的字符串会自动在末尾添加'\0' 4.逐个字符地 ...

  5. c语言bool怎么用_C语言中的一维数组和二维数组什么?怎么用?

    C++| 匠心之作 从0到1入门学编程[免费]​yun.itheima.com C语言除了基本数据类型之外,还提供了构造类型的数据,构造类型的数据包括数组类型.结构体类型和共用体类型.下面我们详细介绍 ...

  6. c语言memset清空指向数组的指针_C语言中数组和指针的关系

    数组的数组名其实可以看作一个指针.看下例: 1.    int array[10]={0,1,2,3,4,5,6,7,8,9},value; 2.    value=array[0]; //也可写成: ...

  7. c语言向文件中写入字符串_C语言中定义字符串的两种方式及其比较

    先看如下代码: 以上用两种方式定义一个字符串: 1.定义一个char * 类型指针,指向字符串首字符首地址. 2.定义一个数组,数组里存放元素为字符串各个字符+'0',其中'0'为码0值,编译器会自动 ...

  8. python数组赋值_对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解

    对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解 列表赋值: >>> a = [1, 2, 3] >>> b = a >>> print ...

  9. c语言以空格分割字符串_C语言: 利用sscanf() 函数分割字符串

    头文件:#include sscanf()函数用于从字符串中读取指定格式的数据,其原型如下: int sscanf (char *str, char * format [, argument, ... ...

最新文章

  1. 动态规划4--最佳加法表达式
  2. git中的删除命令操作
  3. python 写入第二列_python读写Excel表格的实例代码(简单实用)
  4. Caused by: java.lang.IncompatibleClassChangeError: Implementing class
  5. 关于SAP UI5 CRM Reuse Fiori应用的代码审查
  6. 八皇后问题判断此位置是否需合适
  7. Animation Property Animation 使用
  8. 区间合数的最小公倍数(质数+因数分解)
  9. supports-screens
  10. 好用的在线JSON编辑与格式化工具
  11. linux蜂鸣器实验
  12. Python爬取热门微博评论--问题与解决(1)
  13. c语言如何关闭窗口,如何用C脚本关闭当前窗口?
  14. Latex改变页边距
  15. Django应用与分布式路由
  16. 华硕vm510l装固态硬盘_华硕VM510L拆机换固态硬盘
  17. 【C++】完成一个消消乐
  18. 【CISSP备考】第8章:安全模型、设计和能力的原则
  19. 汇编中浮点栈寄存器st0~st7浮点计算fld压栈再计算的过程运行原理
  20. Elasticsearch索引别名alias操作

热门文章

  1. [WPF]WPF中材质制作——图片和矢量图之争
  2. HTML5新特性之WebRTC
  3. ffmpeg实现将MP4格式转封装成avi格式
  4. 高速缓存系统之memcache c++使用实例
  5. 计算机网络工作组英文,十进制网络标准工作组:IPv4,IPv6,IPv9三代协议比较
  6. ssh 框架引入service_搭建SSH开发框架时autowired注入为空的问题
  7. Office365 Manager Plus之报表
  8. Android使用ViewPager+PhotoView实现图片查看器
  9. C#中const和static readonly 的区别
  10. win7 桌面图标拖不动解决方法