咱们知道,c语言中的数据类型有short、int、long、char、float、double六种,可是没有字符串类型,若是咱们要表达一串字符那么应该怎么作呢?
好比abc咱们能够表示为"abc",字符串能够放入数组:数组
char arr1[] = "abc"; char arr2[] = { 'a','b','c' }; printf("arr1 = %s\n", arr1); printf("arr2 = %s\n", arr2);
可见,有两种表示形式,那么这两种输出的结果是否相同,且看:
可见arr2的结果除了abc还另外出现了烫烫烫...相似于乱码的东西。缘由是,arr1中的"abc"---'a','b','c','\0',最后一个的\0是一个转义字符,是字符串的结束标志,其值是0,在计算字符串长度时\0是结束标志,不能算字符串内容,而arr2中则没有\0的表示。
修改一下代码,给arr2加上'\0':ide
char arr1[] = "abc"; char arr2[] = { 'a','b','c','\0'}; printf("arr1 = %s\n", arr1); printf("arr2 = %s\n", arr2);
输出结果彻底相同:
接下来打印一下arr2不加'\0'时的两者的长度,看是否相同:code
char arr1[] = "abc"; char arr2[] = { 'a','b','c'}; printf("%d\n", strlen(arr1)); printf("%d\n", strlen(arr2));
输出结果:
其中arr1的结果毋庸置疑,那么arr2的结果为何是15呢,缘由就是由于arr2没有定义'\0',使得arr2的长度是一个随机值 即arr2:a b c .......直到遇到\0。
若是再给arr2加上‘\0’:blog
char arr1[] = "abc"; char arr2[] = { 'a','b','c','\0'}; printf("%d\n", strlen(arr1)); printf("%d\n", strlen(arr2));
输出结果:
长度也就彻底同样了。字符串
有这么一个路径:c:\test\32\test.c,如今咱们要让它在控制台显示出来,应该怎么作呢?
直接使用双引号括住:it
printf("%s\n", "c:\test\32\test.c");
(Note:c语言中%d打印整型, %c打印字符,%s打印字符串, %f打印浮点型数字==小数,%p以地址的形式打印, %x打印十六进制数字,%lf打印双精度浮点数... )
结果以下:
可见,与咱们所须要的有很大的差异,缘由是‘\’使得‘\’+‘后面的字符’构成了一个转义字符,即\t---水平制表符,\32---八进制数字32,咱们再来看一下这串内容的长度:table
printf("%d\n", strlen("c:\test\32\test.c"));
长度为13,原本应该是17的,但倒是13,缘由就是由于‘\’+‘后面的字符’构成的转义字符独占一位,即\t是一位,\32是一位,\t又是一位,如今再数一下,正好13位。
若是咱们想要完美的输出c:\test\32\test.c这串字符的话,就须要在‘\’的前面再加上一个‘\’,防止其和其后面的字符被解释为一个转义序列符,咱们修改一下代码:class
printf("%s\n", "c:\\test\\32\\test.c");
输出结果:
很完美,再看一下长度:test
printf("%d\n", strlen("c:\\test\\32\\test.c"));
输出结果:
彻底正确,因此,咱们在输出带有‘\’的字符串时,须要在‘\’前再加上一个‘\’来防止被误认为是一个转义字符而影响输出结果。
常见的转义字符:乱码
转义字符 | 意义 |
---|---|
\a | 警告字符 |
\b | 退格符 |
\f | 换页 |
\r | 回车 |
\n | 换行符 |
\t | 水平制表符 |
\v | 垂直制表符 |
\' | 单引号 |
\" | 双引号 |
\ | 反斜杠 |
\ddd | ddd表示1-3个八进制数字 |
\xdd | dd表示2个十六进制数字 |