c语言中的字符数组与字符串

C语言-字符串与字符数组区别 区别: C语言中没有字符串这种数据类型,可以通过char的数组来代替 字符串一定是一个char的数组,但char的数组未必是字符串 数字0(和字符'\0'等价)结尾的char数组就是一个字符串,但如果char数组没有以数字0结尾,那么就不是一个字符串,只是普通字符数组,所以字符串是一种特殊的char数组。 注: %s是打印一个字符串,%c是打印一个字符 %s会接收字符串结束标志'\0... 阅读详情

本文主要的内容转自:http://www.cnblogs.com/lidabo/archive/2012/08/28/2660048.html

在某些地方加入了自己的一些测试结果。

1、字符数组的定义与初始化

字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。

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

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

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

在linux下测试结果:如果字符个数大于数组长度会出现warning: excess elements in array initializer,经过打印后发现,多出的字符并没有写入内存中。

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";

          在linux下测试,可以看到在这种初始化情况下,如果后面字符串的长度大于字符数组的长度,多出的部分也是不会写入内存。

不能等价于:

         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中去。

        5、 strcpy是以'\0'来识别源字符串,所以如果是两个字符数组的拷贝,strcpy会一直找到原字符数组地址后的’\0‘,并一块拷贝到目标字符数组中。这是一个内存数据的拷贝,如果源字符串的长度超过了目标字符串的长度,该函数也会一直将字符串拷贝过去,覆盖目标字符数组后面的数据。

【C#】控制设备管理器中设备的启用/禁用_20220506 通过C#代码实现设备管理器的启用/停止 引入Manamger程序集,查找到所需设备,控制启停 阅读详情

相关推荐

测试用例经典练习之微信发红包测试用例

微信发红包测试用例

ZCYaiCLX3344的博客 1万+

【转】c语言中的字符数组与字符串

1、字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。 char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'}; 即把10个字符分别赋给str[0]到str[9]10个元素 如果

wfx的专栏 1057

YOLOv8_obb的C++工程部署实战:从模型转换到实时视频推理

本文详细介绍了YOLOv8_obb模型在C++环境下的完整工程部署流程,涵盖从PyTorch模型到ONNX格式的转换、基于ONNX Runtime的C++推理引擎搭建、旋转框后处理解析,以及实时视频流处理与性能优化。文章重点解析了模型转换的关键参数、环境配置的常见问题、核心推理代码的实现,并提供了实用的避坑指南,旨在帮助开发者高效完成YOLOv8_obb的C++工程部署。

weixin_29100927的博客 44

python基础知识——字符串

1、字符串的格式化 python将若干值插入到带有“%”标记的字符串中,实现动态地输出字符串。 格式: "%s" % str "%s%s" % (str_1, str_2) 例如: str_0 = "I" str_1 = "Love" str_2 = "China" format = "%s%s%s" % (str_0, str_1, str_2) print format#ILove

null的专栏 3403

FPGA实现Gardner环定时同步:Verilog代码与Testbench实战解析

本文深入解析了在FPGA上实现Gardner环定时同步的完整过程,详细阐述了其非数据辅助的定时误差检测原理。通过Verilog代码实战,展示了内插滤波器、定时误差检测器、环路滤波器和数控振荡器等核心模块的设计,并提供了完整的Testbench验证方法,帮助开发者解决数字通信系统中的时钟同步难题。

gpt4scribbler的博客 574

某10kV纺织厂供电系统设计【CAD图纸源码+Word文档】

本文详细介绍了设计变电所原始资料,负荷统计,基于负荷统计给出了变压器的选型,变电所主接线方式的设计、高低压母线、电缆的技术要求、短路电流的计算以及相关电气设备的保护参数及保护定值的计算、安全措施的规定。

weixin_761237174的博客 2742

C语言学习笔记——字符串和字符数组

c语言中,将字符串作为字符数组来处理。 一、字符串的表示和存储(定义和初始化) 1、字符数组 char str[]="I love China"; //或者char str[]={"I love China"};整体初始化,大括号可以省略 //或者char str[]={'I','l','o','c','e','C','h','i','n','a',0}; 2、字符指针,用指向字符串首地址的方式 char* str ="I love China"; 二、赋值方式 对于字符数组只能对各个元素赋值,不能整体

phily123的博客 728

360可视门铃双摄版数据恢复实战:BIN文件解析与视频重组

本文详细解析了360可视门铃双摄版BIN文件的数据恢复过程,包括文件结构分析、双摄像头数据存储机制及视频重组技术。通过Python开发环境和FFmpeg工具链,成功实现了H.265视频流的解析与重组,为智能家居设备数据恢复提供了实用解决方案。

weixin_29196891的博客 906

C字符串数组赋值

C字符数组赋值 举例如下: char a[10]; 1、定义的时候直接用字符串赋值 char a[10]="hello"; 注意:不能先定义再给它赋值,如  char a[10];  a[10]="hello"; 这样是错误的! 2、对数组中字符逐个赋值 char a[10]={'h','e','l','l','o'}; 3、利用strcpy char a[10];

maopig的专栏 5万+

ATGM332D模块串口配置保姆级教程:从9600波特率到NMEA数据过滤,一次搞定

本文提供ATGM332D模块串口配置的详细教程,涵盖从基础硬件连接到高级NMEA数据过滤的全过程。内容包括波特率优化、数据输出频率调整、NMEA语句过滤等实用技巧,帮助开发者快速掌握GNSS模块配置,提升定位系统性能。

weixin_30664051的博客 513

LSCM最小二乘保角参数化

LSCM最小二乘保角参数化 最小二乘思想 已知一组点的数据(x,y) x x1x_1x1​ x2x_2x2​ x3x_3x3​ … xnx_nxn​ y y1y_1y1​ y2y_2y2​ y3y_3y3​ … yny_nyn​ 可以近似为线性关系 y=ax+by=ax+by=ax+b ,目标为确定常数 aaa , bbb ; 解法:找到 aaa , bbb ,使得所有 yiy_iyi​ 与 axi+bax_i+baxi​+b 偏差的平方和 Q=∑i=1n(yi−axi−b)2 Q=\s

weixin_49732532的博客 4252

C语言指针学习(3)

1.字符串的引用方式 在C语言程序中,字符串是存放在字符数组中的,想引用一个字符串,可以用以下俩种方法 (1)用字符数组存放一个字符串,可以通过数组名和下标引用字符串其中一个字符,也可以用数组名和格式声明“%s”输出字符串 【例题】定义一个字符数组,在其中存放字符串“I love China!”输出该字符串和第八个字符 #include<stdio.h> int main() { char string[]="I love China!"; //定义字符数

weixin_61725225的博客 2243

基于 Qt C++ 的 2D 动画制作工具

你可以修改它的中心坐标 (X, Y)、宽度 (W)、高度 (H),或点击 "选择颜色" 按钮改变其填充色。* **图形视图 (`QGraphicsView` 和 `QGraphicsScene`)**: 用于显示和编辑当前帧的内容。

寒寒豆豆软件公司的博客 111

C语言中字符串和字符数组的区别

C语言中字符串和字符数组的区别1、基本概念2、代码分析3、总结 1、基本概念 字符串和字符数组很相似,但是有本质上的区别。 (1) C语言中,字符串是双引号括起来的单个或多个字符的集合,编译器自动在结尾加上’\0’字符。字符串常量存储在只读数据段,无法通过指针进行修改字符串中的某个字符。 (2)C语言中,不能定义字符串(没有string关键字,只要C++才有),但是在C语言中使用字符串,通常会用字符数组来模拟字符串,必须是’\0’结尾的字符数组,这个字符数组存储通常会分配在栈区,可以被称为字符串,且该字符串

我是你的峰哥哥啊的博客 8405

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

C语言 字符数组 和 字符串 详解 用来存放字符的数组称为字符数组,例如: char a[10]; //一维字符数组 char b[5][10]; //二维字符数组 char c[20]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a','m'}; // 给部分数组元素赋值 char d[]={'c', ' ', 'p', 'r', 'o', 'g', 'r'...

weixin_45691686的博客 7878

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C语言 —— 字符串与字符数组

字符串与字符数组

weixin_45767909的博客 7989

C语言关于字符串和字符数组的转化问题

C语言关于字符串和字符数组的转化问题 小菜鸡CS本科生一枚,第一次写博客,如果有什么写的不对或者不好的欢迎大家批评指正, 写这篇博客的原因是我今天遇到的一道题,题目很简单,leetcode中等难度,可是这道题却困扰了我整整一天,连上课都没好好听讲,无论如何也想不出个所以然。之所以我被困扰了这么久,就是因为字符数组转化字符串的小细节。下面我们进入正题: 要把字符串转化为字符数组是很简单的,有手就行,在这里就不讨论也不解释了,代码如下: int main() { char *str1="numstr";

weixin_47409943的博客 1万+

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

C 语言中并不存在字符串这个数据类型,而是使用字符数组来保存字符串。那么,字符数组就一定是字符串吗? 对于这个问题,大多教科书中的回答是“是”。其实不然,字符数组和字符串是完全不相同的两个概念,千万不要混淆。分析如下所示的示例代码。 #include <stdio.h> #include <string.h> int main(void) { /*字符数组赋初值*/ char cArr[] = {'I','L','O','V','E','C'}; /*字符串赋

nous_x的博客 1万+

C语言之字符串与字符数组的区别

1.字符串的定义: (1)单个字符:(2)一维字符串数组: 3.字符串和字符数组的区别: c语言的字符串由C的字符数组末尾加上'\0'变形而成。

云小逸的博客 1万+

C语言的字符数组和字符串

字符数组是元素的数据类型为字符类型的数组。

2301_80547771的博客 2284

C语言字符串与字符数组

C语言字符串与字符数组 1. 字符串与字符数组 1.1 C 语言字符串 什么是字符串? 通俗的讲字符串是由一串字符组成,例如 “Hello World\n”,即是一个字符串。 C 语言中没有真正意义上的字符串类型,字符串由字符数组或者字符串常量来表示。 什么是字符串常量? const char *p = "Hello World\n"; 上述示例中 "Hello World\n"即是一个字符串常量,该常量由一个字符类型指针保存其实际地址。该字符串常量一般存储于 静态存储区。C 语言字符串常

annjeff的博客 2714

c语言字 字符串转换成数组_c语言中的字符数组与字符串

1、字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'};即把10个字符分别赋给str[0]到str[9]10个元素如果花括号中提供的字符个数大于数组长度,则按语法错误处理;若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 '...

weixin_40003478的博客 1万+

C语言 字符数组和字符串

(后面两个就是‘\0’,字符+‘\0’=字符串)(apple00 就是 a0 行数组,apple,分别对应 a00 ,a01 ,a02,a03 ,a04,a05,a06)连接前,两串均以 '\0' 结束,连接后,串 1的 '\0' 取消,新串最后加 ‘\0’strncpy(p,p1,n) ,复制指定长度字符串(复制一个两个三个四个)C语言中没有字符串常量,用字符数组处理字符串,字符串结束表示:‘\0’格式:strcpy(字符串1,字符串2);格式:strcmp(字符串1,字符串2)字符数组1必须足够大。

2401_87994648的博客 1108

C语言,字符数组与字符串

文章目录字符数组基本介绍字符串注意事项字符串的访问和遍历字符串的表示形式用字符数组存放一个字符串: 用字符数组存放一个字符串,用字符指针指向一个字符串使用字符指针变量和字符数组两种方法表示字符串的讨论字符串相关函数常用字符串函数一览字符串函数应用案例字符串(字符数组)使用注意事项和细节字符串(字符数组)课堂练习 字符数组基本介绍 用来存放字符的数组称为字符数组, 看几个案例 1)char a[10]; //一维字符数组, 长度为 10 2)char b[5][10]; //二维字符数组, 后面我们详细介绍二

weixin_45417821的博客 3877
上一篇: Android 调用系统的设置项
下一篇: Android 判断一个服务是否运行
骑行的蜗牛
博客等级 码龄21年 107粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值