C语言基础 - 字符串/字符数组最易错考点

简介: 该文探讨了C语言中'\0'字符对字符串和字符数组的重要性,以及`strlen`和`sizeof`的区别。'\0'作为字符串的结束标志,确保了正确打印和计算字符串长度。示例代码显示,未包含'\0'的字符数组打印时可能出现随机值。`strlen`计算字符串长度,不包含'\0',而`sizeof`返回变量或数组的总字节数,包括'\0'。文章还提醒注意转义字符在字符串中的影响,例如`\t`和`\62`。最后总结了字符串和字符数组处理时应注意的要点。

一、 '\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。


总结


介绍了字符串与字符数组中最易错的3个考点。若以后遇到其他相关的易错点,会再补充。

相关文章
|
5天前
|
编译器 C语言 C++
【C语言基础】:字符函数和字符串函数-2
【C语言基础】:字符函数和字符串函数
|
5天前
|
C语言
【C语言基础】:字符函数和字符串函数-1
【C语言基础】:字符函数和字符串函数
TU^
|
5天前
|
存储 编译器 程序员
C语言之数组
C语言之数组
TU^
12 1
|
5天前
|
C语言
C语言——字符串操作函数
C语言——字符串操作函数
5 0
|
5天前
|
存储 程序员 编译器
【C语言基础】:数组
【C语言基础】:数组
|
6天前
|
存储 缓存 C语言
C语言易错小贴士
C语言易错小贴士
|
13天前
|
C语言
C语言学习记录——鹏哥字符分类函数、字符转换函数
C语言学习记录——鹏哥字符分类函数、字符转换函数
12 2
|
13天前
|
安全 编译器 C语言
C语言学习记录——字符串相关函数及部分模拟(strcmp、strncmp、strncat、strncpy、strstr、strtok、strerror)
C语言学习记录——字符串相关函数及部分模拟(strcmp、strncmp、strncat、strncpy、strstr、strtok、strerror)
13 1
|
13天前
|
C语言
C语言学习记录——模拟字符串相关函数(strcpy、strlen、strcat)相关知识-const、typedef
C语言学习记录——模拟字符串相关函数(strcpy、strlen、strcat)相关知识-const、typedef
10 1
|
6天前
|
算法 Unix Linux
C语言随机数的产生(rand、srand、time函数细节讲解)
C语言随机数的产生(rand、srand、time函数细节讲解)