c语言中的字符数组和字符串之间的关系

2023-11-12

一、字符串的结束标志

1、很多时候我们都是可以看到相关的内容就是:

使用数组来存储字符串,也就是我们经常会使用到sizeof()和这个函数,而,这个函数只是求出当前该数组的最大容量,而不是数组中实际存放的内容,我们一般都是需要使用'\0'来表示字符串的而结尾,并且没有影响到相应的数组的操作的其他的内容,而是在系统外部自动添加的。这就是操作系统的问题,所以我们是可以使用'\0'来判断字符串的结束。
(所以我们使用while来循环对字符串的输出等,字符串的长度就不那么的重要了)
'\0'一个空的操作符,并且ascii码是0,也就是不会显示,并且也没有什么操作;即为:不会增加附加的操作或者增加有效的字符。只是起到一个辨别的标志。


2、字符串中的常量
eg:printf("how do you do ?\n");
想过没有,系统是怎么知道字符串到哪里结束???可能我们都是很理所当然的就是系统告诉了我们。
actually:内存中存放时候,系统会自动在'\n'后面增加一个'\0'作为字符串的结束标志。
printf执行的原理是: 每执行一个字符之前都会检查一下这个字符是否为'\0',如果遇到'\0'就会停止输出。


字符串的初始化:
类似我们一般的数据来进行初始化:
方式1)char c[]={'I',' ',a','m',' ',h','a','p','p','y','\0'};//就是逐个对应赋值


通过对字符串的常量的了解:
通过字符串的方式进行赋值;
方式2)char c[]={"I am happy"};


方式1)的字符串的长度是11,方式2)的字符串的长度是10


所以:若是,
char c[10] = {"china"};
前五个是元素,第六个是'\0',后面的4个也设定了空字符。


说明:字符串并不要求最后一个字符为'\0',甚至可以不包含'\0'。是否需要'\0',系统会自动增加。


为了方法处理的一直性,常常认为的增加了一个'\0'在数据的后面。
eg:char c[6]={'c','h','i','n','a','\0'};
这样处理便于引用字符数组中的字符串。

总结:
不管是数组的方式一个个对应的对号赋值,还是通过字符串常量的方式赋值,我们都应该使用统一的范式。
也就是数组的方式我们应该赋值一个'\0'作为结束标志,而字符串常量系统会自动增加。

二、字符数组的输入和输出
两种方法:
1、逐个字符输入输出,格式符是"%c",循环输出。
2、将整个字符串一起输出。格式符是"%s",表示输出的是字符串

char c[] = {"china"};
prinft("%s",c);
输出时,遇到'%c'就停止输出。输出结果是china
注意事项:
1)输出字符不包含'\0',因为这个是操作系统和语言的问题,不是数据本身的问题。
2)"%s" 在函数中的输出项是字符数组名。
3)若是数组的长度大于字符串的实际长度,还是遇到'\0'就停止输出。
char c[10]={"china"}; 同样是输出:china 而不是输出10个字符
4)如果数组中有大于1个'\0'的符号的,遇到第一个'\0'的时候就会停止输出。
5)可以使用scanf("%s",c);输入一个字符串


char str1[5],str2[5],str3[5];
scanf("%s,%s,%s",str1,str2,str3);
输入数据:
How are you?
元素存放的情况:
How\0\0 
are\0\0 
you?\0
即为输入的时候,空格表示输入结束。

如果改为;
char str[13];
scanf("%s",str);
键盘输入:
How are you?
输出的将会是:
How
原理:
How\0\0……(后面的都是\0)
原因:因为系统将空格符号作为输入字符串之间的分隔符。

三、字符串的处理函数
1、puts(字符数组)
作用:将一个字符串(以'\0'结束的字符系列)输出到终端。
eg:
char str[]={"china \n Bei jing"};
puts(str);


 char str[]={"china \nBei Jing"};
    printf("%s",str); //这个末尾没有自动换行
    puts(str);  //这个末尾是自动换行
由于字符串的输出常常会用到printf()函数,所以puts()函数使用得很少。

2、gets(字符数组)
作用:从终端输入一个字符串到字符数组,并且得到一个函数值。
该函数值是字符数组的起始地址。
eg:
gets(str)


#include <stdio.h>
#include <stdlib.h>
int main()
{
    char str[100];
    char *p;
   p = gets(str);
   //在终端中输出字符串“hello”,即为将hello字符串发送给数组str,
   //且注意送个字符数组的个数是6而不是5,
    //因为还有一个\0 结束标识符


    puts(p); //输出字符串,并且自动换行
    printf("%s\n",p); //输出字符串
    printf("%p\n",p); //输出首地址
//(一般的:gets()函数的目的是向字符数组输入一个字符串,二不大关心其函数值)
    return 0;
}


注意事项:
puts()
gets()
只是能够输出或者输入一个字符串,不能够输入、输出多个字符串。
下面是错误的格式:
gets(str1,str2);
puts(str1,str2);

3、strcat(字符数组1,字符数组2) 全称(string catenate字符连接) 
将字符数组2中的字符串链接到字符数组1的末尾,返回的函数值是字符1的首地址,
也就是将结果存放在字符数组1中。
eg:
#include <stdio.h>
#include <stdlib.h>
int main()
{
    char str1[40] = {"I am student "};
    char str2[] = {"You are very good"};
    printf("%s",strcat(str1,str2));
    return 0;
}
//输出的结果将会是:I am student You are very good

注意事项:
1、就是数组1应该足够大,以便于容纳后面加入的字符串。
如果上面将str1修改为:char str1[]={"……"},即为没有提供足够的控件,加入数据之后,就会显示错误。
2、两个字符串的后面都有一个'\0'字符,连接了以后,str1中的那会没有,之后链接之后最后面的一个'\0'字符。



4、strcpy 、strncpy 函数
(string copy)字符串赋值 (string number copy)
strcpy(字符数组1,字符串2)
作用:是将字符串2复制到字符数组1中。
eg:
char str1[10]='',str2[]={"china"};
说明;
1)字符数组1必须定义足够大容纳字符串2
2)字符数组1必须写成数组名形式,“字符串2”可以是字符数组名,也可以是字符串常量。
eg:strcpy(str1,"china");
3)如果在赋值前没有对str1数组赋值,则str1的内容将会不可知的。复制的时候将str2中的字符串和其后面的'\0'一起复制到字符数组1中的,也就是复制了6个字符,而后面的4个字符还是保持着原来的内容。
4)不能够将一个字符串常量或字符数组直接给一个字符数组。
eg:下面的不合法的表示方法:
str1 = "china";
str1 = str2;
原因:
赋值符号"=",赋值语句只能够将一个“字符”赋值给一个“字符变量”;
而字符串只能够使用strcpy函数将一个字符串赋值到另外一个字符数组中。
&&也就是c语言中字符串赋值只能够使用strcpy等等拷贝函数。
5)strncpy 函数将字符串2中前面n个字符复制到字符数组1中
如下:
strncpy(str1,str2,2);


5、strcmp函数
strcmp(字符串1,字符串2) 全称:string campare 字符串比较
比较字符串1 和字符串2
字符串比较规则:
两个字符串自左到右逐个字符相比(安照ASCII码值比较大小),知道字符不同或者'\0'的时候截止,判断出大小。
str1>str2 ,函数值是正数
str1=str2 ,函数值是 0 
str1<str2 ,函数值是负数


6、strlen(字符数组) 全称:string length (字符串的长度)
函数的值是字符串的实际长度,不包含'\0'在内。
即使我们在用数组定义的时候有'\0'在内,只不过只是为了统一处理而增加的。
#include <stdio.h>
#include <stdlib.h>
#include <string.h> \\c中的标准库寒素
int main()
{
  char str3[]={'d','2','\0'};
  char str4[]={'d','2'};

    printf("%d \n",strlen(str3));

    printf("%d \n",strlen(str4));
    printf("%d  \n",strcmp(str3,str4));

    printf("%s \n",str3);
    printf("%s \n",str4);
    return 0;
}
//1、注意c语言标准库中有string.h 的头文件,但是么有string这个类的说法,
//2、c语言中中的string.h头文件存放着的是strcpy等等函数
//3、string是一个普通名词,也就是字符串的意思,在c语言总就是存放着一些对char类型数据的操作,
//在上面的(2)已经讲过,知道c++中有string类,才可以定义相应的对象。
//4 、strlen计算出来的就是字符串中的有效长度,



//5 、上面的程序的运算结果是:

为什么会出现这个问题呢?

因为我们在直接通过字符数组初始化的时候,没有自动在末尾添加'\0',在内存中还是自动存放在内存上,所以没有'\0'很好的作为结束符,所以会出现上面的错误,

如果我们使用功能scanf()以及gets()函数的时候,编译器会自动添加'\0'。

如果使用字符常量来表示的话,上面已经讲到了,都会自动添加'\0'的,所以特殊的就是字符数组了。

同时,上面提到字符字符数组中的末尾加上'\0'和没有'\0'其实没有太大的变化。长度都是相等。可能不同版本会是不一样的。



7、strlwr(字符串) 全称;string lowercase 字符串小写
//将字符串中的字符都编程小写


8、strupr(字符串) 全称:string uppercase
//将字符串中的字符都编程大写


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言中的字符数组和字符串之间的关系 的相关文章

  • 计算机组成原理——指令系统题库

    指令系统题库 选择题 1 以下有关指令系统的说法中错误的是什么 A 指令系统是一台机器硬件能执行的指令全体 B 任何程序运行前都要先转化为机器语言 C 指令系统是计算机软件 硬件的界面 D 指令系统和机器语言是无关的 2 在CPU执行指令的

随机推荐

  • tip消息定时弹窗功能 核心代码

    for var i 0 i lt 5 i var j 0 var arr 1 2 5 7 8 setTimeout function console log arr j i 3000
  • 深度学习与神经网络笔记

    在正式学习之前 首先清楚一下当前出现了很多次的概念是什么 这些概念之间的关系是什么 人工智能 AI 研究 开发用于模拟 延伸和扩展人的智能的理论 方法 技术和应用系统的一门新的技术科学 机器学习 实现人工智能的一种途径 以机器学习为手段解决
  • 《现代C++教程》笔记(2)

    2 语言可用性的强化 2 1 常量 nullptr 问题 C 不允许直接将 void 隐式转换到其他类型 但如果编译器尝试把 NULL 定义为 void 0 那么在下面这句代码中 char ch NULL 没有了 void 隐式转换的 C
  • 处理系统装机后BitLocker锁硬盘问题

    处理系统装机后BitLocker锁硬盘问题 今天重装公司里面的电脑发现装好后系统的D E盘被BitLocker锁住了 然后总结出了以下两种解决方法 可能不是非常详细但是还是希望可以对大家有所帮助 文章目录 处理系统装机后BitLocker锁
  • 总结使用Unity3D优化游戏运行性能的经验

    一 遇到麻烦时要调用 垃圾回收器 Garbage Collector 无用单元收集程序 以下简称GC 由于具有C C 游戏编程背景 我们并不习惯无用单元收集程序的特定行为 确保自动清理你不用的内存 这种做法在刚开始时很好 但很快你就公发现自
  • 2021-06-20

    TIM2 PWM部分初始化 PWM输出初始化 arr 自动重装值 psc 时钟预分频数 void TIM2 PWM Init u16 arr u16 psc GPIO InitTypeDef GPIO InitStructure TIM T
  • Symbol类型详解

    Symbol类型详解 symbol类型通过Symbol函数生成 用于表示独一无二的值 不使用new关键字 直接调用即可创建 例 const s Symbol str 即使使用相同的字符串来创建Symbol类型的值 这些值也是不同的 symb
  • 基于MATLAB GUI的裂缝检测(识别)系统(支持向量机)

    主要内容 本文对裂缝检测技术进行了深入研究 并结合裂缝图像的特征 提出了一种基于传统机器学习和图像处理技术的裂缝检测方法 实现裂缝基本参数的计算和显示 内容如下 1 裂缝图像采集 无人机 2 裂缝图像预处理 3 裂缝分割 提取 裂缝连接 4
  • 【Spring学习03】Spring简单入门实例

    本文博客地址 http blog csdn net soonfly article details 68498742 转载请注明出处 国际惯例 从一个简单的例子入门 轻松了解依赖注入 拿之前提到的场景 假设我们开发了一套管理系统 每收到一笔
  • GPS纠偏算法,适用于google,高德体系的地图

    GPS纠偏算法 适用于google 高德体系的地图 精确度还比较高 我试了一下比高德本身的纠偏还精确点 gps纠偏算法 适用于google 高德体系的地图 author Administrator public class GpsCorre
  • IOS H5 输入框输入后不显示内容,需要失焦后才显示

    input 框输入文本后 还在 focus 的状态 输入的内容显示空白 点击完成失去焦点后内容才出来 解决方案 input 框增加一个样式 transform translateZ 0
  • C++ : 矩阵初等行变换,化成最简矩阵

    化成最简矩阵分成如下步骤 从矩阵的第 i 0 行开始化简 1 寻找最长元素行 从第i行开始 寻找第一个开头行元素非0的行 利用行交换把该行换到矩阵的第i行 2 对第i行进行化简 对第i行的所有元素同除该行的首个非0元素 3 矩阵行化简 从矩
  • linux系统日志查看-停止-继续

    linux系统日志查看 停止 继续 查看日志实时刷新 tail f 文件名 查看显示1000行 tail 1000f 文件名 查看暂停刷新 按键 Ctrl s 查看继续刷新 按键 Ctrl q 查看尾部最后100行 tail n 10 te
  • c语音动态内存分配,内存重新分配,内存释放,指针运算

    c语音基础 中的基础 大神请直接关闭本页面 多谢合作 总结下这学习到的知识点 define CRT SECURE NO WARNINGS include
  • Windows 10快速在指定目录打开命令行

    一 我们在想要到达的目录上按住shift键并点击鼠标右键 看到了吗 这时候在弹出菜单里多了一个选项 就是 在此处打开命令窗口 我们点开看一下 二 不过有时候我们需要以管理员的权限来打开命令行 这时候我们需要自行添加一个脚本 方便操作 你可以
  • 蓝桥杯 排列序数

    标题 排列序数 X星系的某次考古活动发现了史前智能痕迹 这是一些用来计数的符号 经过分析它的计数规律如下 为了表示方便 我们把这些奇怪的符号用a q代替 abcdefghijklmnopq 表示0 abcdefghijklmnoqp 表示1
  • Elasticsearch分布式全文搜索引擎

    文章目录 一 Elasticsearch 是什么 二 ES安装 1 安装软件 2 启动失败问题解决 三 ES入门 1 数据格式 2 索引 3 文档操作 4 映射操作 5 高级查询 一 Elasticsearch 是什么 Elasticsea
  • 【华为OD机试】最小传输时延I【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 某通信网络中有N个网络结点 用1到N进行标识 网络通过一个有向无环图表示 其中图的边的值表示结点之间的消息传递时延 现给定相连节点之间的时延列表times i u v
  • 114-----JS基础-----事件的委派(实际是利用了事件的冒泡)

    一 代码 不难 事件的委派就是利用了事件的冒泡
  • c语言中的字符数组和字符串之间的关系

    一 字符串的结束标志 1 很多时候我们都是可以看到相关的内容就是 使用数组来存储字符串 也就是我们经常会使用到sizeof 和这个函数 而 这个函数只是求出当前该数组的最大容量 而不是数组中实际存放的内容 我们一般都是需要使用 0 来表示字