空字符'\0'与字符串

article/2025/10/30 23:51:46

from: https://blog.csdn.net/bairenxinmo/article/details/17662983

空字符'\0'

空字符即NUL字节,是一个ASCII值为0的控制字符,在程序代码中通常以转义序列'\0'表示,在C语言中,空字符非常重要,主要体现在字符串中。

字符串

字符串就是一串零个或多个字符,并且以bit模式为全0的NUL字节即空字符('\0')结尾。C语言中字符串没有显示的数据类型,字符串通常存储在字符数组或动态分配的内存中,在编码操作中通常将整个字符串作为操作对象,常用操作包括复制、查找、比较等。

空字符与字符串

1、空字符是字符串的终止符。注:空字符本身不是字符串的一部分,所以字符串的长度并不包含空字符;

2、操作字符串时,必须保证字符串以空字符结尾(注:不以空字符结尾的字符序列,不是字符串)。

 

如果在一个需要字符串的地方(例如strlen函数的参数)使用了一个不是以空字符结尾的字符序列,会造成什么结果呢?

a、strlen函数将无法知道空字符是没有的,所以它将继续进行查找,一个接一个字符查找直到发现一个空字符为止,或许它找几百个字符才找到,而此时strlen函数的这个返回值从本质上说是一个随机数或者说并没有实际意义;

b、如果字符串操作函数试图访问了系统分配给这个程序以外的内存范围,程序会崩溃(通常表现为段溢出,程序异常退出)。

 

潜在不以空字符结尾的字符序列操作总结:

a、char *strcpy(char *dst, char const *src) 假如源字符串src比目标字符数组dst长,多余的字符仍将被复制,它们将覆盖原先存储于目标字符数组dst后面的内存空间的值(程序存在崩溃可能也会影响其他存储值),最后目标字符数组dst显然是不以空字符结尾的字符序列,所以必须保证目标字符数组dst的空间能足以容纳源字符串src;

b、char *strncpy(char *dst, chat const *src, size_t len)  同上,首先必须保证目标字符数组dst的空间能足以容纳len个字符,除此之外,如果strlen(src)的值大于或等于len,那么只有len个字符被复制到dst中,但dst最终将不会以空字符结尾 -- 最好手动补\0

c、char *strcat(char *dst, char const *src)  假如源字符串src比目标字符数组dst剩余的空间长,多余的字符仍将被复制,它们将覆盖原先存储于目标字符数组dst后面的内存空间的值(程序存在崩溃可能也会影响其他存储值),最后目标字符数组dst显然是不以空字符结尾的字符序列,所以必须保证目标字符数组dst剩余的空间能足以容纳源字符串src;

d、char *strncat(char *dst, char const *src, size_t len) 同上,首先必须保证目标字符数组dst剩余的空间足以容纳len个字符,除此之外,如果strlen(src)的值大于或等于len,那么会有len个字符被复制到dst结尾处,但假如dst原有剩余空间刚好可以容纳len个字符,dst最终将不会以空字符结尾;

e、int strcmp(char const *s1, char const *s2)  strcmp函数的参数必须都以一个空字符结尾,如果并非如此,strcmp就可能对参数后面的字节进行比较,这个比较结果将不会有实际意义,同理strncmp也一样。

 

测试代码:

#include <stdio.h>
#include <string.h>int main()
{int len;char str[5];strcpy(str, "12345678");                   /*字符串拷贝*/len =strlen(str);                          /*字符串长度*/printf("str_len:%d\n", strlen(str));       /*打印目标字符串长度*/printf("str:%s\n", str);                   /*打印目标字符串*/  return 0;
}

测试结果:

测试分析:

测试代码中,函数strcpy将大于目标字符数组str存储空间长度的字符串拷贝给str(实际操作中会对其他存储值进行覆盖,危险操作,在作者的测试环境中未引发程序崩溃不代表在实际的开发环境中不会引起程序崩溃),目标字符串str最多存储5个字符,字符打印时结果为str:12345也证明如此,但字符串长度却实际输出为6,长度6根本没有实际意义,在其他测试环境中可能为大于5的任意值(如7、8等)。


http://chatgpt.dhexx.cn/article/hePgGrCM.shtml

相关文章

空字符和空格字符有什么区别?

char ch1 \0 ,ch2 ;System.out.println(""(int)ch1);System.out.println(""(int)ch2); 运行结果 由此可见&#xff0c;空字符(\0)的ascii值是0&#xff0c;实际应用上是字符串结尾自动补上的一个字符 有的时候用来判断是否到了字符串结尾 而空格字符…

认真理清 一一空字符('\0')、空指针(NULL)、\0、0

在C/C语言中我们经常看到’\0’、NULL。从概念上看两者完全不同&#xff0c;但是本质上他们都可以用数值0来表示。空指针是指针类型&#xff0c;而空字符是整形类型&#xff0c;两者有时很容易混淆。 NULL 空指针有一个值&#xff0c;该值不会与任何数据的有效值地址对应。通…

空字符 空格字符(字符) 空字符串 NULL的区别

【1】 空字符 空格字符&#xff08;字符&#xff09;【2】空字符串 【3】 NULL的区别 1.1 字符 &#xff08;1&#xff09;首先必须明确字符型&#xff08;char&#xff09;是整数类型&#xff0c;其在内存单元是以整数形式存放。 &#xff08;2&#xff09;其次&am…

CSS属性值的计算过程

属性值的计算过程 一个元素一个元素依次渲染&#xff0c;顺序按照页面文档的树形目录结构进行 渲染每个元素的前提条件&#xff1a;该元素的所有CSS属性必须有值 一个元素&#xff0c;从所有属性都没有值&#xff0c;到所有的属性都有值&#xff0c;这个计算过程&#xff0…

Java 反射设置/获取对象属性值

✨大家好&#xff0c;我是【zhuzicc】~ &#xff0c;一位主攻【Java】的 攻城狮&#xff01;✨ 欢迎对【Java】感兴趣的大佬&#xff0c;关注我 &#x1f61c; ———————————————— ❤️ ❤️ ❤️ 如果觉得本文还不错&#xff0c;点赞 评论 关注 收藏。有补充…

字段与属性

字段的使用: 1.关于字段 a.字段又称为&#xff1a;“成员变量”&#xff0c;一般在类的内部做数据交互使用。 b.字段命名规范&#xff1a;camel命名法&#xff08;Camel 命名法是指第一个单词小写&#xff0c;从第二个单词开始每个单词的首字母大写&#xff09;。 2.通俗的理解…

jQuery获取标签属性值(一)

1、box-shadow属性可以设置盒子阴影的效果其参数为&#xff1a; box-shadow: h-shadow v-shadow blur spread color inset; h-shadow必需的。水平阴影的位置。允许负值v-shadow必需的。垂直阴影的位置。允许负值blur可选。模糊距离spread可选。阴影的大小color可选。阴影的颜…

如何获取对象的属性及属性值

for(key in attr){//key:属性名//attr[key]:属性值 } 转载于:https://www.cnblogs.com/wanlibingfeng/p/10070080.html

JS中如何通过属性获取属性值

JS中如何通过属性获取属性值 const mySymbol Symbol()let obj {name:cwl,1: 1,true:bool,[mySymbol]: sym, }当属性名是字符串 一般通过 . 来访问 obj.name当属性名是数字时 obj[1] //√ obj.1 //报错当属性值是bool类型 obj[true] obj.true obj[true]当属性值为Symbol类…

获取object对象中的属性值

获取object对象中的属性值 先创建一个实体类并向上转型为Object类 假设实体类如下 public class WordDto {private String uuId;private Long id;private Long aid;private String content;}WordDto dtonew WordDto();dto.setAid(10000002L).setId(12L).setUuId("12345…

值类型属性??

再一次由于C#中值类型和引用类型的区别 犯了错误。 假设在类中包含一些值类型的成员&#xff08;比如结构&#xff0c;数组&#xff09;&#xff0c;你希望为外部程序提供访问和修改这些成员的能力&#xff0c;同时又不想直接暴露成员&#xff0c;在c#中最常见的做法就…

计算属性

1、什么是计算属性 计算属性&#xff1a;可以理解为能够在里面写一些计算逻辑的属性。 作用&#xff1a;1&#xff09;减少模板中的计算逻辑 2&#xff09;数据缓存。当我们的数据没有变化时&#xff0c;不在执行计算的过程 3&#xff09;依赖固定的数据类型&#xff08;响应式…

根据属性名获取、设置属性值

1.根据属性名获取属性值 可以通过JDK自带的反射下的getClass下的getDeclaredField并传递一个属性名字来获取该属性 属性名&#xff1a;fileName&#xff0c;对象&#xff1a;Object object&#xff1b; Field field object.getClass().getDeclaredField(fileName); 设置对象…

常用属性 属性值

文本属性&#xff08;用来修饰文本&#xff09; 1、font-size:数值单位&#xff1b; 字体大小 页面中默认字号大小为16px 2、font-family:字体名&#xff1b; 如果字体名为中文&#xff0c;引号可加可不加&#xff1b;如果字体名为一个英文单词&#xff0c;引号可不加&#…

.39属性名和属性值

一、属性名 对象的属性名可以随便起&#xff0c;但使用特殊字符时&#xff0c;需要用下面的形式 语法&#xff1a;对象[属性名]属性值 输出时也要采用该种形式 这种形式&#xff0c;更加常用&#xff0c;并且可以直接传递变量 二、属性值 属性值可以为任意的数据类型&…

对象的属性名与属性值

注意共有5个步骤&#xff0c;按顺序操作下去 1.在对象中保存的值称为属性&#xff0c;对象的属性名不强制要求遵守标识符规则&#xff0c;什么名称都可以&#xff0c;我对象属性的语法&#xff1a;1对象.属性名&#xff0c;注意&#xff1a;如果对象中没有的属性&#xff0c;不…

关于HTML中的那些特殊字符

一些特殊的符号&#xff0c;我们在html 里面很难或者不方便直接使用&#xff0c;我们此时可以使用下面的替代代码。 虽然有很多&#xff0c;但是我们平时用的比较较少&#xff0c; 大家重点记住 空格 大于号 小于号 就可以了&#xff0c;剩下的回来查阅。 总结&#xff1a; 是…

python处理HTML特殊字符

提取html数据时遇到特殊字符的问题 ",<,>都被转换为特殊字符&#xff0c;导致html页面一团乱麻 通过各种百度&#xff0c;最终找到python的html包处理相关特殊字符 最终结果

怎么在html中加特殊符号,html中特殊符号

html中特殊符号: 教你用输入法打出任意特殊符号&#xff0c;缺失&#xff1a;html中3248/9 最近老有人问我这个符号怎么打&#xff0c;那个符号怎么打。 我每次回答的都是&#xff0c;你要打的是特殊符号&#xff0c;这种特殊符号不能用输入法打出来&#xff0c;需要借助一些工…

Html特殊字符表(建议收藏)

Html特殊字符表(建议收藏) 原始字符entity原始字符entity"&quot ;&&amp ;’&#039 ;<&lt ;>&gt ;&nbsp ;¡&iexcl ;¢&cent ;£&pound ;&curren ;&yen ;&brvbar ;&sect ;&uml ;©&…