一.字符串
这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字 符串,例如“hello.\n”
注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。
字符串的打印输出
由于在c语言中是没有字符串这种数据类型的,所以我们可以用指针类型或者数组类型来对字符串进行存储输出,下面来看一段代码:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> /*输出一个字符串,因为c语言中是没有字符串类型的,所以可以用指针类型或者数组类型对字符 串进行输出*/ int main(){//int main是c99标准 char* p = "abcde";/*char*为指针类型,p为指针 abcde为字符串,C语言中是没有 特定的字符串类型的*/ printf("%s\n", p);/*打印这个字符串,若要打印字符串 则参数为%s,输出结果为abcde*/ char str[] = { "bit" };//用双引号括起来表示字符串,其中默认是有一个结束标志\0 char str2[] = { 'b','i','t' }; char str3[] = { 'b', 'i', 't' ,'\0'}; char str4[7] = { 'b', 'i', 't' ,'t'};/*此时如果给定了数组的大小,以此数组为 例,它是有七个格子,前四个放入了bitt, 则后面三个此时默认放的都是\0*/ printf("%s\n", str);/*输出结果为bit,原因是字符串的结束标志为\0 的转义字符但是平时是不会写出来的,是系统默认的, 所以当字符串“bit”存到char类型的数组时会自动 在末尾存入\0*/ printf("%s\n", str2);/*输出结果为bit烫烫烫烫蘠it,原因是此时的'b','i','t' 已经不再是字符串了,则不再默认有\0符号,所以 在输出字符串的时候会bit后面的是随机输出的,即找到 \0结束标志才会结束*/ printf("%s\n", str3);/*输出结果为bit,此时有结束标志\0,*/ printf("%s\n", str4);/*输出结果为bitt*/ return 0; }
如图我们可以看到我们分别用指针类型和数组类型对字符串进行了存储。
对于指针存储的字符串的输出结果如下:
对于数组存储的字符串的输出结果如下:
在这里可能大家对此输出结果可能会有疑问,我们来对每句输出语句进行解释:
char str[] = { "bit" }; printf("%s\n", str);
在这里我们可以看到此数组的输出结果为bit,原因是首先用双引号括起来表示字符串,其中默认是有一个结束标志\0,字符串的结束标志为\0的转义字符平时是不会写出来的,是系统默认的,所以当字符串“bit”存到char类型的数组时会自动在末尾存入\0。
char str2[] = { 'b','i','t' }; printf("%s\n", str2);
在这里我们可以看到此数组的输出结果为bit烫烫烫烫烫烫烫烫烫烫烫烫烫烫蘠it,原因是此时的'b','i','t'已经不再是字符串了,则不再默认有\0符号,所以 在输出字符串的时候bit后面的是随机输出的,即找到\0结束标志才会结束。
char str3[] = { 'b', 'i', 't' ,'\0'}; printf("%s\n", str3);
在这里我们可以看到此数组的输出结果为bit,原因是虽然此处'b','i','t'已经不再是字符串了,但是多了一个结束标志\0,在输出字符串时找到结束标志\0时便会结束,则输出结果为bit
char str4[7] = { 'b', 'i', 't' ,'t'}; printf("%s\n", str4);
在这里我们可以看到此数组的输出结果为bitt,原因是虽然'b','i','t''t'已经不再是字符串了,但是此处我们可以看到确定了数组的大小为7,那么数组的前四个格子放满后还空了三个格子,此时我们经过调试发现为三个\0结束符,调试的结果如下:
字符串的长度
我们在求字符串长度时一般会用到strlen()方法 ,同时也会有sizeof()方法与之作为类比,下面我们来对两种方法通过代码的形式来进行一个对比,首先来看一段代码:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h>//strlen库函数包含在<string.h>的头文件当中 //计算字符串的长度 int main(){ char* p = "abc"; int a = strlen(p);/*strlen库函数为求字符串的长度,但不包含\0结束符,即遇见\0结束符便会停止,所以字符串“abc”其长度为3*/ printf("字符串abc长度为%d\n", a);//输出a的值为3 int c = sizeof(p); printf("字符串abc长度为%d\n", c);//输出c的值为4,sizeof获得的是该指针所占的地址空间,32位操作系统对应4字节,64位操作系统对应8字节 char* d = "abc\0des"; int b = strlen(d); printf("字符串abc\\0des长度为%d\n", b);/*字符串abc\0des的长度为3原因是strlen函数再求字符串长度的时候遇到\0会停止, 所以上述字符串在遇到\0时停止后长度只求到了字母c,故长度为3*/ int l = sizeof(d); printf("字符串abc\\0des长度为%d\n", l);//sizeof获得的是该指针所占的地址空间,32位操作系统对应4字节,64位操作系统对应8字节,所以此结果为4 char str2[] = "asdfgh";// int e = strlen(str2); printf("字符串asdfgh长度为%d\n", e);//输出e的值为6 int f = sizeof(str2); printf("字符串asdfgh长度为%d\n", f);//输出f的值为7,因为sizeof获得该数组所占内存空间大小,包括字符串结尾的'\0',所以结果为7 char str3[8] = { 'a', 's', 'd' }; int g = strlen(str3); printf("其长度为%d\n", g);//输出g的值为3 int h = sizeof(str3); printf("其长度为%d\n", h);//输出h的值为8,因为sizeof获得该数组所占内存空间大小,但是大小确定为8,故sizeof得到的结果是8 char str4[] = "as\0df"; int i= strlen(str4); printf("字符串as\0df长度为%d\n", i);//输出i的值为2,因为strlen函数在求字符串长度时遇见\0结束符便会停止 int o = sizeof(str4); printf("字符串as\0df长度为%d\n", o);//输出o的值为6,因为sizeof获得该数组所占内存空间大小,包括字符串结尾的'\0',所以结果为6 printf("%d\n", strlen("c:\test\328\test.c")); /*\ddd为格式ddd表示1~3个八进制的数字,所以\328中末位数为8是不能被进行转义的, 原因是八进制数字最高只能取到7,所以\32被解析成一个转义字符,故8不能被转义,所以其长度为14*/ return 0; }
下面来对每个模块代码进行分析:
char* p = "abc"; int a = strlen(p);/*strlen库函数为求字符串的长度,但不包含\0结束符,即遇见\0结束符便会停止,所以字符串“abc”其长度为3*/ printf("字符串abc长度为%d\n", a);//输出a的值为3 int c = sizeof(p); printf("字符串abc长度为%d\n", c);//输出c的值为4,sizeof获得的是该指针所占的地址空间,32位操作系统对应4字节,64位操作系统对应8字节
根据上述代码,此时我们用指针类型来存储字符串,首先用strlen方法对其长度进行输出,因为strlen方法在计算长度时是不包含结束符\0,所以遇见\0时便会停止,则其长度为3,而当我们用sizeof方法针对指针类型时,此时最后的输出结果都为4,原因是若在32位操作系统中,首先指针变量存放的是地址, 而地址在内存中都是十六进制的数字,为int类型,所以是四个字节,但是若在64位操作系统中,此时指针变量的大小为八个字节
输出结果为:
在32位操作系统中
在64位操作系统中
char* d = "abc\0des"; int b = strlen(d); printf("字符串abc\\0des长度为%d\n", b);/*字符串abc\0des的长度为3原因是strlen函数再求字符串长度的时候遇到\0会停止, 所以上述字符串在遇到\0时停止后长度只求到了字母c,故长度为3*/ int l = sizeof(d); printf("字符串abc\\0des长度为%d\n", l);//sizeof获得的是该指针所占的地址空间,32位操作系统对应4字节,64位操作系统对应8字节,所以此结果为4
根据上述代码,此时我们用指针类型来存储字符串,首先用strlen方法对其长度进行输出,因为strlen方法在计算长度时是不包含结束符\0,所以遇见\0时便会停止,则其长度为3,而当我们用sizeof方法针对指针类型时,此时最后的输出结果都为4,原因是若在32位操作系统中,首先指针变量存放的是地址, 而地址在内存中都是十六进制的数字,为int类型,所以是四个字节,但是若在64位操作系统中,此时指针变量的大小为八个字节
输出结果为:
在32位操作系统中
在64位操作系统中
char str2[] = "asdfgh";// int e = strlen(str2); printf("字符串asdfgh长度为%d\n", e);//输出e的值为6 int f = sizeof(str2); printf("字符串asdfgh长度为%d\n", f);//输出f的值为7,因为sizeof获得该数组所占内存空间大小,包括字符串结尾的'\0',所以结果为7
根据上述代码,此时我们用数组类型来存储字符串,首先用strlen方法对其长度进行输出,因为strlen方法在计算长度时是不包含结束符\0,所以遇见\0时便会停止,则其长度为6,而当我们用sizeof方法针对数组类型时,此时sizeof获得是该数组所占的内存空间大小,包括字符串结尾的'\0',一共有七个字符,每个字符占一个字节,所以结果为7.
输出结果为:
char str3[8] = { 'a', 's', 'd' }; int g = strlen(str3); printf("其长度为%d\n", g);//输出g的值为3 int h = sizeof(str3); printf("其长度为%d\n", h);//输出h的值为8,因为sizeof获得该数组所占内存空间大小,但是大小确定为8,故sizeof得到的结果是8
根据上述代码,此时我们用数组类型来存储字符串,首先用strlen方法对其长度进行输出,因为strlen方法在计算长度时是不包含结束符\0,所以遇见\0时便会停止,而数组的前三个格子占满后,后五个全部为\0,则其长度为3.
而当我们用sizeof方法针对数组类型时,此时sizeof获得是该数组所占的内存空间大小,此数组中一共有八个字符,而一个字符占1个字节,所以一共是八个字节.
输出结果为:
char str4[] = "as\0df"; int i= strlen(str4); printf("字符串as\0df长度为%d\n", i);//输出i的值为2,因为strlen函数在求字符串长度时遇见\0结束符便会停止 int o = sizeof(str4); printf("字符串as\0df长度为%d\n", o);//输出o的值为6,因为sizeof获得该数组所占内存空间大小,包括字符串结尾的'\0',所以结果为6
根据上述代码,此时我们用数组类型来存储字符串,首先用strlen方法对其长度进行输出,因为strlen方法在计算长度时是不包含结束符\0,所以遇见\0时便会停止,则其长度为2.
而当我们用sizeof方法针对数组类型时,此时sizeof获得是该数组所占的内存空间大小,包括字符串结尾的'\0',而char为1个字节,一共有6个字符,则字节大小为6.
其输出结果为:
二.转义字符
转义字符顾名思义就是转变意思:下面来看一些转义字符
以上就是一些常见的转义字符,下面我们来看一段代码:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h>//strlen库函数包含在<string.h>的头文件当中 //转义字符的使用 int main(){ //问题一:如何在屏幕打印输出“helloworld” printf("%s\n", "\"helloworld\"");//输出结果为“helloworld” //问题二:如何在屏幕打印输出单引号 ' //问题三:如何在屏幕打印输出双引号'' printf("%s\n", "\'"); printf("%s\n", "\""); return 0; }
当我们想输出某个符号时,就在它的前面加上\即可,例如图中的三个问题,大家可以进行参考,附上面程序的运行结果。
三.注释
在c语言中有行注释与块注释两种
行注释:用//xxxx来表示
块注释:用/*xxxxx*/来表示
注意:在块注释中可以嵌套行注释,但不能嵌套块注释
快捷键:1.ctrl+k+c 注释
2.ctrl+k+u 取消注释