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("%d\n",i1);
printf("%d\n",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("%s\n",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、如果定义了一个字符数组,那么它有确定的内存地址;而定义一个字符指针变量时,它并未指向某个确定的字符数据,并且可以多次赋值。

'\0’的问题

对字符数组,有以下几种定义方法:

  1.    char str[]="12345";
    

或给字符串加上大括号:char str[]={“12345”};

这种方法定义时,系统会自动在字符串的末尾加上字符串结束符,即 ‘\0’,

  1.    char str[10]={'1','2','3','4','5'};
    

这种方法定义时,系统会自动从未初始化的元素开始,将之后的元素赋为\0,如上面的数组str中的元素实际上是:‘1’,‘2’,‘3’,‘4’,‘5’,’\0’,’\0’,’\0’,’\0’,’\0’

  1.    char str[]={'1','2','3','4','5'};
    

这种方法定义时,系统不会自动在字符串的末尾加上字符串结束符;

此时用sizeof()函数可以正确求出其所占的内存大小;但用strlen()函数不能正确求出其长度,因为strlen是通过\0判断字符串结束的。

所以,采用该方法定义时,一般人为地加上\0,即char str[]={‘1’,‘2’,‘3’,‘4’,‘5’, ‘\0’};

易错情况:
1、char a[10]; a[10]=“hello”;//一个字符怎么能容纳一个字符串?况且a[10]也是不存在的!
2、char a[10]; a=“hello”;//这种情况容易出现,a虽然是指针,但是它已经指向在堆栈中分配的10个字符空间,现在这个情况a又指向数据区中的hello常量,这里的指针a出现混乱,不允许!

还有:不能使用关系运算符“==”来比较两个字符串,只能用strcmp() 函数来处理。

补充:

无论是静态,局部还是全局数组只有在定义时才能初始话,否则必须通过其它方法,比如循环操作实现。

任何
int a[3];
static int b[3];
a[3] = {1, 2, 3};
b[3] = {1, 2, 3};
没有在定义时初始化都是错误的!

用字符指针定义时:

  1.    只能采用字符串的方式初始化:char *str3="12345";
    

注意:字符指针可以用字符串常量初始化和赋值;

即:char *str3;str3=“12345”;也是可以的

此时也可以用str3[4]的形式访问其中的元素,如cout<< str3[4];就会输出str指向的字符串的第四个元素。

该方法也是自动加上了字符串结束符的。

————————————————
有兴趣可以加入我们的自动化测试技术交流群,QQ群号码:301079813

本群探讨loadrunner/JMeter测试、Selenium/RobotFramework/Appium自动化测试、接口自动化测试,测试工具等测试技术,让我们来这里分享经验、交流技术、结交朋友、拓展视野、一起奋斗!

C语言字符数组与字符串的使用及加结束符‘\0‘的问题相关推荐

  1. C语言 字符数组 和 字符串 详解

    C语言 字符数组 和 字符串 详解 用来存放字符的数组称为字符数组,例如: char a[10]; //一维字符数组 char b[5][10]; //二维字符数组 char c[20]={'c', ...

  2. php和c语言的字符数组中,字符数组和字符串的区别,C语言字符数组和字符串区别详解...

    C 语言中并不存在字符串这个数据类型,而是使用字符数组来保存字符串.那么,字符数组就一定是字符串吗? 对于这个问题,大多教科书中的回答是"是".其实不然,字符数组和字符串是完全不相 ...

  3. c语言字符数组与字符串的使用详解

    转自http://www.jb51.net/article/37456.htm 1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ ...

  4. c语言在数组输出字母,c语言字符数组与字符串的使用详解

    1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ 'I',' ','a','m',' ','h','a','p','p','y' ...

  5. 字符数组和字符串的区别,C语言字符数组和字符串区别详解

    C 语言中并不存在字符串这个数据类型,而是使用字符数组来保存字符串.那么,字符数组就一定是字符串吗? 不一定,字符数组和字符串千万不要混淆.字符串是一种特殊的字符数组,并且C语言提供了大量适用于字符串 ...

  6. C语言字符数组和字符串数组的初始化

    //字符数组的初始化 char c1[3] = {'A','a','c'}; printf("%d\n", sizeof(c1)); //3 char c2[10] = { 'A' ...

  7. C语言字符数组与字符串

    研究几个案例: 输出图案: #include <stdio.h>void main() {char a[5][5] = {{' ', ' ', '1', ' ', ' '},{' ', ' ...

  8. strcmp可以比较数组么_6.3 C语言字符数组

    01字符数组的定义 1.用来存放字符数据的数组是字符数组.字符数组中的一个元素存放一个字符. 2.定义字符数组的方法和定义数值型数组的方法类似. 例子: char c[10]; 02 字符数组的初始化 ...

  9. C语言 | 字符数组

    C语言字符数组的定义 字符数组是用来存放字符数据的数组,字符数组中的一个元素存放一个字符,定义字符数组的方法和定义数值型数组的方法类似. //例子:char character[10]; C语言字符数 ...

最新文章

  1. 编程界的“马太效应”,是什么在阻止你变得更加优秀?
  2. 找不到php的版本,php – 在任何版本中都找不到请求的包…
  3. python中if else语句用法_Python中if-else语句的多种写法
  4. Good Number Gym - 102769G 2020年CCPC秦皇岛分站赛
  5. 创建线程的方式_创建线程有几种不同的方式?
  6. 【opencv学习】ROI区域和图像填充
  7. 浅析MSIL中间语言——基础篇
  8. linux安装rabbitmq过程,Linux安装RabbitMQ
  9. 基于JAVA+SpringMVC+Mybatis+MYSQL的学生选课系统
  10. Ubuntu下跑通py-faster-rcnn、详解demo运作流程
  11. 【Java数据结构】Map与Set、搜索树、哈希表
  12. 设置View的四个角为圆角
  13. cpu —>内存—>硬盘这种方式是不是更慢?
  14. IDEA打开README.md文件时卡死
  15. win10环境下如何安装CAD
  16. 导航栏一级标题上下箭头切换
  17. 【2021自我知识蒸馏】Extracting knowledge from features with multilevel abstraction
  18. [渝粤教育] 中国地质大学 信息资源管理 复习题
  19. web图片铺满网页_CSS实现网页背景图片自适应全屏
  20. 我用GAN实现了魔法照片!效果太逼真!

热门文章

  1. 全新的Spring Authorization Server快速入门
  2. 皮一皮:没有草原也敢买马?
  3. Gradle7.0,依赖统一管理的全新方式,了解一下~
  4. 在人脸识别的时候,一定要穿上衣服啊!
  5. 皮一皮:论一件艺术品的诞生...
  6. Spring Boot Profile使用详解及配置源码解析
  7. 四条使用Spring BeanUtils的总结
  8. MySQL的大分页查询该如何优化?
  9. 运用单例模式、建造者模式和策略模式实现异步加载Android联系人资料
  10. 平面法向量,点云法向量估计及可视化