热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C中哪些方式定义的字符串,其末尾会自动添加‘\0’

一、‘\0’的本质:‘\0’就是8位的00000000,因为字符类型中并没有对应的这个字符,所以这么写。‘\0’就是字符串结束标志。‘\0’是转译字符,意思是告诉编译器,这不是字符
一、‘\0’ 的本质:

‘\0’就是8位的00000000,因为字符类型中并没有对应的这个字符,所以这么写。‘\0’就是 字符串结束标志

‘\0’是转译字符,意思是告诉编译器,这不是字符0,而是空字符。空字符\0对应的二进制为00000000,而数字0为00110000

原来,在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。字符串总是以’\0’作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符 ‘\0’存入数组,并以此作为该字符串是否结束的标志。有了’\0’标志后,就不必再用字符数组的长度来判断字符串的长度了。

‘\0’:即空字符,在c语言中,字符是按其所对应的ASCII码来存储的,一个字符占一个字节。ASCII码表如下:

Bin

(二进制)

Oct

(八进制)

Dec

(十进制)

Hex

(十六进制)

缩写/字符

解释

0000 0000

00

0

0x00

NUL(null)

空字符

 

字符串结束标志为‘\0’

判断一个字符串是否结束的标志就是看是否遇到‘\0’,如果遇到‘\0’,则表示字符串结束。

 二、字符串定义方法:

1、字符数组:

(1)、char str[]=”12345″;

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

或 char str[6]=”12345″

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

(2)、char str[10]={‘1′,’2′,’3′,’4′,’5’};

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

(3)、char str[]={‘1′,’2′,’3′,’4′,’5’};

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

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

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

既:

char str[]={‘1′,’2′,’3′,’4′,’5’, ‘\0’};

char str[6]={‘1′,’2′,’3′,’4′,’5’}; //故意给数组预留一个空位

char str[]={“12345”};

代码示例:

#include
#include
using namespace std;
int main()
{
char str1[] = "12345";
char str2[10] = { '1','2','3','4','5' };
const char *str3 = "12345";
char str4[] = { '1','2','3','4','5',0 };
char str5[] = { '1','2','3','4','5' };
printf("%d,%d,%d,%d,%d,%d\n", str2[5], str2[6], str2[7], str2[8], str2[9], str3[4]);
printf("各个字符串为:%s,%s,%s,%s,%s\n", str1, str2, str3, str4, str5);
printf("各个字符串的所占的内存大小为:%d,%d,%d,%d,%d\n", sizeof(str1), sizeof(str2), sizeof(str3), sizeof(str4), sizeof(str5));
printf("各个字符串的有效长度为:%d,%d,%d,%d,%d\n", strlen(str1), strlen(str2), strlen(str3), strlen(str4), strlen(str5));
printf("%d\n", strcmp(str1, str3));
printf("%d\n", strcmp(str1, str5));
return 0;
}

运行结果:

《C中哪些方式定义的字符串,其末尾会自动添加‘<img class=’》&#8221; />

2、字符指针

只能采用字符串的方式初始化:char *str3=&#8221;12345&#8243;;

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

即:char *str3;str3=&#8221;12345&#8243;;也是可以的

此时也可以用str3[4]的形式访问其中的元素,如cout<

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

字符串结束符&#8217;\0&#8242; -何时自动加- 字符串定义方法

C语言中字符串结束符&#8217;\0&#8242;

三、C语言中,利用宏定义一个字符串和字符数组,定义的字符串其末尾都会自动添加 ‘\0’ 字符吗?

答案是:会自动添加‘\0’,用程序进行验证:

#include
#define MYPHONE "AT+CMGS"
unsigned char SMS[] = "HELLO, WELCOME TO RCCTS!";
unsigned char *String;
unsigned char i = 0;
void main()
{
printf("**************this procedure is to confirm \\0 's exist****************\n");
/********************************验证MYPHONE字符串末尾是否有\0字符*************************/
String = MYPHONE;
while (*String) //当*String所指向的字符等于\0时跳出循环
{
i = *String;
printf("%c", i);
String++;
}
if (*String == '\0') { //再次确认字符串的末尾是否有\0字符存在
printf("\\0"); //有则打印出来
}
else {
printf("**"); //没有则打印**
}
printf("\n");
printf("MYPHOnE=%s\n", &MYPHONE); //打印字符串 这里%s的s必须为小写
/**************验证SMS字符串末尾是否有\0字符****************/
String = SMS;
while (*String) //当*String所指向的字符等于\0时跳出循环
{
i = *String;
printf("%c", i);
String++;
}
if (*String == '\0') { //再次确认字符串的末尾是否有\0字符存在
printf("\\0"); //有则打印出来
}
else {
printf("**"); //没有则打印**
}
printf("\nSMS=%s\n", &SMS); //打印字符串 这里%s的s必须为小写
}

运行结果:

《C中哪些方式定义的字符串,其末尾会自动添加‘<img class=’》&#8221; />

参考链接:C语言中,利用宏定义一个字符串和字符数组定义的字符串其末尾都会自动添加\0字符

 

 


推荐阅读
  • 本文详细介绍了C语言中的基本数据类型,包括整型、浮点型、字符型及其各自的子类型,并探讨了这些类型在不同编译环境下的表现。 ... [详细]
  • KMP算法是一种高效的字符串模式匹配算法,能够在不进行回溯的情况下完成匹配,其时间复杂度为O(m+n),其中m和n分别为文本串和模式串的长度。本文将详细介绍KMP算法的工作原理,并提供C语言实现。 ... [详细]
  • 本文介绍了一种基于选择排序思想的高效排序方法——堆排序。通过使用堆数据结构,堆排序能够在每次查找最大元素时显著提高效率。文章详细描述了堆排序的工作原理,并提供了完整的C语言代码实现。 ... [详细]
  • 掌握Mosek矩阵运算,轻松应对优化挑战
    本篇文章继续深入探讨Mosek学习笔记系列,特别是矩阵运算部分,这对于优化问题的解决至关重要。通过本文,您将了解到如何高效地使用Mosek进行矩阵初始化、线性代数运算及约束域的设定。 ... [详细]
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • KMP算法是处理字符串匹配的一种高效算法它首先用O(m)的时间对模板进行预处理,然后用O(n)的时间完成匹配。从渐进的意义上说,这样时间复 ... [详细]
  • 本题探讨如何在两个长度为 n 的整数序列中,找到它们的最长公共子序列(LCS)。题目保证第一个序列中的元素各不相同。我们将深入分析并提供一种高效的求解方法。 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • 本文详细解析了Java中throw和throws的关键区别,同时涵盖了JDK的定义、Java虚拟机的关键约定、Java的跨平台性、自动垃圾回收机制、源文件结构、包的概念及作用等多个核心知识点,旨在帮助学生更好地准备Java期末考试。 ... [详细]
  • 本文详细介绍了Java中的注解功能,包括如何定义注解类型、设置注解的应用范围及生命周期,并通过具体示例展示了如何利用反射机制访问注解信息。 ... [详细]
  • 本文详细探讨了Java命令行参数的概念、使用方法及在实际编程中的应用,包括如何通过命令行传递参数给Java程序,以及如何在Java程序中解析这些参数。 ... [详细]
  • 本文详细介绍了Linux内核中misc设备驱动框架的实现原理及应用方法,包括misc设备的基本概念、驱动框架的初始化过程、数据结构分析以及设备的注册与注销流程。 ... [详细]
  • 1、字符型常量字符型常量指单个字符,是用一对单引号及其所括起来的字符表示。例如:‘A’、‘a’、‘0’、’$‘等都是字符型常量。C语言的字符使用的就是 ... [详细]
  • 版本控制工具——Git常用操作(下)
    本文由云+社区发表作者:工程师小熊摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复 ... [详细]
author-avatar
狂风
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有