C语言字符串与字符数组面试题中最易错考点详解
作者:碳基肥宅
本文介绍字符串与字符数组中最易错的3个考点。若以后遇到其他相关的易错点,会持续补充更新。
一、'\0'对字符串与字符数组的重要性
#include<stdio.h> #include<string.h> //下面代码,打印结果是什么? int main(){ char arr1[] = "abc"; char arr2[] = { 'a', 'b', 'c'}; char arr3[] = { 'a', 'b', 'c','\0'}; printf("arr1 %s\n",arr1); printf("arr2 %s\n",arr2); printf("arr3 %s\n",arr3); return 0; }
运行程序结果如下:
其中,arr1与arr3的打印结果正确,而arr2打印结果出现了异常(打印的其实是随机值)。这是'\0'的使用造成的差异。
我们知道,'\0'是字符串的结束标志,当遇到'\0'时,字符串才算作结束。在计算字符串长度时,作为结束标志的'\0'不算做字符串的内容。
本题中%s意味着三个数组都以字符串的形式打印,arr1是字符串字面量"abc",其中末尾自带隐藏的'\0';而arr3则是人为手动地在末尾添加了'\0',它们两个均有'\0'作结尾。计算机能很好地识别到这个'\0',并正确打印两个数组。而arr2由于没有'\0',打印时计算机“找不着尾”,只能打印出随机值,当在内存中“偶遇”一个'\0'时它才停止。
二、strlen与sizeof有什么区别
先说结论
事实上二者没有什么的关联。
总结如下
1. strlen 是一个包含在 string.h 中的字符串库函数,用于求字符串长度(也只能对字符串求长度)。它计算的是'\0'之前的所有字符的个数(不包括'\0')。
2. sizeof 是一个操作符。它计算变量、数组、类型的大小,单位是字节byte。
示例
char a[] = "abcdef"; strlen(a) = 6; //一共有6个字符(不包括'\0') sizeof(a) = 7; //一共有7个字符元素(包括'\0'),且每个元素都是char型变量,分别占1字节。 //总大小为 7*1=7(byte)
注意
虽然'\0'在 strlen 中不算数,但它实际存在且占了空间。因而在计算所占空间总大小(sizeof)时,必须把'\0'也算入其中,作为一个字符元素参与计算。
补充示例
char arr1[] = "abc"; char arr2[] = {'a','b','c'}; sizeof(arr1) // 4*1 = 4 (byte) sizeof(arr2) // 3*1 = 3 (byte) strlen(arr1) // 共有3个非'\0'字符,故答案为3 strlen(arr2) // 没有'\0'做结尾,故为随机值
三、含转义字符求字符串长度
引例
如果要在屏幕上打印一个目录: c:\code\test.c 我们这样写代码:
#include <stdio.h> int main() { printf("c:\code\test.c\n"); return 0; }
恐怕不能达到想要的效果:
原因很简单:\t 作为转义字符,表示“水平制表符”的含义,不再是字面含义'\'和't'两个字符的拼接。
转义字符如下:
要小心这些藏在一堆字符串字母中的转义字符!请看如下代码,请问程序会输出什么?
//程序输出什么? #include <stdio.h> int main() { printf("%d\n", strlen("abcdef")); printf("%d\n", strlen("c:\test\628\test.c")); return 0; }
第一个printf输出6,而第二个printf输出的是14. 通过上表的查阅我 们可知,\62最终会被解析成一个转义字符(注意,不是\628被转义,因为八进制中没有数字‘8’!),加上其余两个转义字符'\t' ,合计起来的字符串长度是14。
到此这篇关于C语言字符串与字符数组面试题中最易错考点详解的文章就介绍到这了,更多相关C语言字符串与字符数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!