#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;
}
运行结果:
?
|