C语言字符串与字符数组面试题中最易错考点详解

 更新时间:2022年09月22日 09:38:39   作者:碳基肥宅  
这篇文章主要介绍了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语言字符串与字符数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言使用stdlib.h库函数的二分查找和快速排序的实现代码

    C语言使用stdlib.h库函数的二分查找和快速排序的实现代码

    以下是对C语言使用stdlib.h库函数的二分查找和快速排序的实现代码进行了详细的介绍,需要的朋友可以过来参考下。希望对大家有所帮助
    2013-10-10
  • C++实现对回收站里的文件进行操作的示例代码

    C++实现对回收站里的文件进行操作的示例代码

    这篇文章主要为大家详细介绍了C++如何使用代码对回收站里的文件进行操作,譬如文件的删除与恢复等,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴快跟随小编一起学习学习吧
    2023-06-06
  • C++ 系统String类详解

    C++ 系统String类详解

    这篇文章主要介绍了C++的系统String类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11
  • C语言猜凶手及类似题目的实现示例

    C语言猜凶手及类似题目的实现示例

    本文主要介绍了C语言猜凶手及类似题目的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C语言分支循环其嵌套语句的使用

    C语言分支循环其嵌套语句的使用

    本文主要介绍了switch 嵌套和循环嵌套,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C++详细讲解print缓冲区的刷新

    C++详细讲解print缓冲区的刷新

    这篇文章主要介绍了print缓冲区刷新问题,实现代码简单易懂,具有很好的参考价值,希望对大家有所帮助,需要的朋友可以参考下
    2022-05-05
  • C++野指针和悬空指针的实现方法

    C++野指针和悬空指针的实现方法

    野指针和悬空指针是指针中常见的两个概念,本文详细的介绍了这两种的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C++中delete指针后最好将其置空的操作方法

    C++中delete指针后最好将其置空的操作方法

    C++编程中,当你使用delete运算符释放指针所指向的内存后,通常将该指针置空,如果一个指针在被删除后没有置空,而你在代码的其他部分再次尝试删除同一个指针,可能会导致程序崩溃或产生未定义行为,本文介绍C++中delete指针后最好将其置空的操作方法,感兴趣的朋友一起看看吧
    2024-06-06
  • 深入探究C++ string的内部究竟是什么样的

    深入探究C++ string的内部究竟是什么样的

    这篇文章主要给大家介绍了关于C++ string的内部究竟是什么样的,文中通过示例代码的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 递归删除二叉树中以x为根的子树

    递归删除二叉树中以x为根的子树

    今天小编就为大家分享一篇关于递归删除二叉树中以x为根的子树,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03

最新评论