解释C语言中的字符串数组(详细解析)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
//#include <cstdio>

//cstdio是将stdio.h的内容用C++头文件的形式表示出来。
//stdio.h是C标准函数库中的头文件,即:standard buffered input& output。提供基本的文字的输入输出流操作(包括屏幕和文件等)。由于C语言并没有提供专用于文字输入输出的关键字,所以该库是最普遍的C语言程序加载库。
//cstdio 和 stdio.h是有差别的,并不是同样的文件。
//stdio.h是以往的C和C++的头文件,cstdio是标准C++(STL),且cstdio中的函数都是定义在一个名称空间std里面的,如果要调用这个名字空间的函数,必须得加std::或者在文件中声明using namespace std。

//在新的C++标准中,生成新头文件的方法仅仅是将现有C++头文件名中的.h去掉。例如,<iostream.h>变成了< iostream>,<complex.h>变成了<complex>等等。
//对于C头文件,采用同样的方法,但在每个名字前还要添加一个c。所以C的<string.h>变成了<cstring>, <stdio.h>变成了< cstdio>,等等。 标准C头文件如<stdio.h>继续被支持。头文件的内容不在std中。
//具有C库功能的新C++头文件具有如这样的名字。它们提供的内容和相应的旧C头文件相同,只是内容在std中。
void test01()
{
	//1、字符数组的定义与初始化
	//字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。

	//char c01[10] = "abcdefghijk";		报错,数组长度为12,至少初始化数组长度为12
	char c01[12] = "abcdefghijk";
	printf("%s\n", c01);

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

void test02()
{
	//在c语言中,将字符串作为字符数组来处理。(c++中不是)	
	//系统对字符串常量也自动加一个'\0'作为结束符。例如"C Program”共有9个字符,但在内存中占10个字节,最后一个字节'\0'是系统自动加上的

	//有了结束标志'\0'后,字符数组的长度就显得不那么重要了,在程序中往往依靠检测'\0'的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度。当然,在定义字符数组时应估计实际字符串长度,保证数组长度始终大于字符串实际长度。(在实际字符串定义中,常常并不指定数组长度,如char str[])
	//说明:'\n’代表ASCII码为0的字符,从ASCII码表中可以查到ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不干。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。
	//对C语言处理字符串的方法由以上的了解后,再对字符数组初始化的方法补充一种方法——即可以用字符串常量来初始化字符数组:

	char c01[] = { "I am happy" };      // 可以省略花括号,如下所示
	char c02[] = "I am happy";
	printf("%s\n", c01);
	printf("%s\n", c02);

	//注意:上述这种字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值,字符数组的赋值只能对其元素一一赋值
	//下面的赋值方法是错误的
	//char c03[];
    //c03 = "I am happy";

	//不是用单个字符作为初值,而是用一个字符串(注意:字符串的两端是用双引号“”而不是单引号‘’括起来的)作为初值。显然,这种方法更直观方便。(注意:数组str的长度不是10,而是11,这点请务必记住,因为字符串常量"I am happy"的最后由系统自动加上一个'\0')
	//因此,上面的初始化与下面的初始化等价

	//以下两个字符串·前者的长度是11,后者的长度是10.
	char c03[] = { 'I',' ','a','m',' ','h','a','p','p','y','\0' };
	char c04[] = { 'I',' ','a','m',' ','h','a','p','p','y' };
	printf("%d\n", sizeof(c03));
	printf("%d\n", sizeof(c04));

	//说明:字符数组并不要求它的最后一个字符为'\0',甚至可以不包含'\0',向下面这样写是完全合法的。
	//char c05[5] = { 'C','h','i','n','a' };
	//但是最后的输出会带有一堆乱码,知道计算机在内存上的输出遇到'\0'为止
	char c05[10] = { 'I' , ' ' , 'a' , 'm' , ' ' , 'h' , 'a' , 'p' , 'p' , 'y' };
	printf("%s\n", c05);
	//输出会是I am happy加一堆乱码,因为上面的字符数组没有在结尾定义一个'\0'

	//输出会使I am happy,数组还有内存空间,字符数组会在末尾添加一个'\0',这样就能正确输出
	char c06[11] = { 'I' , ' ' , 'a' , 'm' , ' ' , 'h' , 'a' , 'p' , 'p' , 'y' };
	printf("%s\n", c06);
}

void test03()
{
	//3、字符串的表示形式
	//在C语言中,可以用两种方法表示和存放字符串:
	//(1)用字符数组存放一个字符串
	char c01[] = "I love China";

	//(2)用字符指针指向一个字符串
	char* c02 = "I love China";

	//C语言对字符串常量是按字符数组处理的,在内存中开辟了一个字符数组用来存放字符串常量
	//程序在定义字符串指针变量c02时会把字符串首地址(即存放字符串的字符数组的首地址)赋给c02。

	printf("%s\n", c01);
	printf("%s\n", c02);
}

int main()
{
	test01();
	test02();
	test03();

	return 0;
}



运行结果:

 

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值