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

目录
  • 一、'\0'对字符串与字符数组的重要性
  • 二、strlen与sizeof有什么区别
  • 三、含转义字符求字符串长度

本文介绍字符串与字符数组中最易错的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语言字符串与字符数组内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言中关于计算字符串长度的几种方式

    目录 计算字符串长度的几种方式 自定义函数 使用string头文件中的strlen()函数 使用sizeof()操作符 计算字符串长度,使用sizeof和strlen的坑 使用strlen计算 使用sizeof计算 计算字符串长度的几种方式 C语言计算字符串长度,可以手动计算也可以使用库函数或者sizeof()操作符. 自定义函数求长度 使用strlen()函数 使用sizeof()操作符 自定义函数 int cont_str(char *s) {     int i = 0;        

  • C语言字符串函数,字符函数,内存函数使用及模拟实现

    目录 求字符串长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 长度受限制的字符串函数 strncpy strncat strncmp 字符串查找函数 strstr strtok strerror 字符函数 字符分类函数 字符转换函数 内存操作函数 memcpy memmove memcmp memset 求字符串长度 strlen 函数功能 字符串长度,求一个字符串中字符的个数(不包含’\0’). 函数参数: size_t strlen( const ch

  • 一波C语言字符数组实用技巧集锦

    字符数组倒序 #include <stdio.h> void daoxu(char str[]){ int i; char temp; for(i = 0; i < strlen(str) / 2 ; i ++){ temp = str[i]; str[i] = str[strlen(str) - i-1]; str[strlen(str) - i-1] = temp; } } 单词计数    int wordCount(char str[]){ int i; int count = 0

  • c语言字符数组与字符串的使用详解

    1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ 'I',' ','a','m',' ','h','a','p','p','y'};即把10个字符分别赋给str[0]到str[9]10个元素如果花括号中提供的字符个数大于数组长度,则按语法错误处理:若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 '\0' ). 2.字符数组与字符串在c语言中,将字符串作为字符数组来处理.(c++中不是)在实际应用

  • C语言超全面讲解字符串函数

    目录 1.gets函数 2.puts函数 3.strcat函数 4.strcpy函数(strncpy函数) 5.strcmp函数(strncmp函数) 6.strlen函数 7.strlwr函数 8.strupr函数 9.strstr函数 注意:在使用字符串处理函数时,一定要使用#include <string.h>开头 1.gets函数 其形式为:gets(字符数组)——输入字符串的函数 作用是从终端输入一个字符串到字符数组,并且得到一个函数值. 2.puts函数 其形式为:puts(字符数

  • 浅析C语言中的数组及字符数组

    我们来编写一个程序,以统计各个数字.空白符(包括空格符.制表符及换行符)以及所有其它字符出现的次数.这个程序的实用意义并不大,但我们可以通过该程序讨论 C 语言多方面的问题. 所有的输入字符可以分成 12 类,因此可以用一个数组存放各个数字出现的次数,这样比使用 10 个独立的变量更方便.下面是该程序的一种版本: #include <stdio.h> /* count digits, white space, others */ main() { int c, i, nwhite, nothe

  • C语言之从字符数组中删除特定的字符

    从字符数组中删除特定的字符,即输入要删除的指定字符,利用for循环找到非指定字符,将非指定字符输出即可.以下为具体的实现方法: #include<stdio.h> int main() { char str[100],c; int j,k; printf("please input a string:"); gets(str); printf("\nEnter a character:"); c=getchar(); for(j=k=0;str[j]!=

  • C语言字符串函数模拟实现流程介绍

    目录 一.strlen 1.使用计数器 2.使用函数递归 3.使用指针-指针 二.strcpy 三.strcat 四.strcmp 该文章将简易模拟实现strlen.strcpy.strcat.strcmp.strstr.那么让我们废话少说,直接开始吧. 一.strlen strlen-Get string length.即获取字符串长度.函数参数为 const char* str,函数返回类型为 size_t.如下图所示: strlen函数的读取结束标志为’\0’,因此,若字符串中没有’\0’

  • C语言中的字符串数据在C中的存储方式

    目录 内存中的五大区域 字符串数据在C语言中有两种存储方式 几个比较容易混的点 统计字符串中某一个字符出现的次数 使用字符指针数组来存储多个字符串数据 内存中的五大区域 栈:是专门用来存储局部变量的,所有的局部变量都是声明在栈区域中 堆:允许程序员手动的从堆申请指定字节数的空间来使用 BSS段:是用来存储未初始化的全局变量和静态变量,声明一个全局变量,如果我们没有初始化,在程序运行最开始的时候,这个全局变量是没有初始化的,存储在BSS段[程序运行后系统就自动的初始化为0,并把初始化后的全局变量存

  • Go语言实现二维数组的2种遍历方式以及案例详解

    二维数组遍历的2种方式: package main import ( "fmt" ) func main() { //定义一个二维数组 var arr = [2][3]int{{1, 4, 3},{7, 5, 6}} //方式1. 用for循环来遍历 for i := 0; i < len(arr); i++ { for j := 0; j < len(arr[i]); j++ { fmt.Printf("%v ",arr[i][j]) } fmt.Pr

  • C语言中的正则表达式使用示例详解

    正则表达式,又称正规表示法.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE).正则表达式是使用单个字符串来描述.匹配一系列符合某个句法规则的字符串. 在c语言中,用regcomp.regexec.regfree 和regerror处理正则表达式.处理正则表达式分三步: 编译正则表达式,regcomp: 匹配正则表达式,regexec: 释放正则表达式,regfree. 函数原型 /* 函数说明:Regcomp将正则表达式字符串regex编译

  • Java面试题之MD5加密的安全性详解

    目录 1.彩虹表 什么是彩虹表 2.解决方案 3.实现代码 总结 MD5 是 Message Digest Algorithm 的缩写,译为信息摘要算法,它是 Java 语言中使用很广泛的一种加密算法.MD5 可以将任意字符串,通过不可逆的字符串变换算法,生成一个唯一的 MD5 信息摘要,这个信息摘要也就是我们通常所说的 MD5 字符串.那么问题来了,MD5 加密安全吗? 这道题看似简单,其实是一道送命题,很多人尤其是一些新入门的同学会觉得,安全啊,MD5 首先是加密的字符串,其次是不可逆的,所

  • Kotlin 语言中调用 JavaScript 方法实例详解

    Kotlin 语言中调用 JavaScript 方法实例详解 Kotlin 已被设计为能够与 Java 平台轻松互操作.它将 Java 类视为 Kotlin 类,并且 Java 也将 Kotlin 类视为 Java 类.但是,JavaScript 是一种动态类型语言,这意味着它不会在编译期检查类型.你可以通过动态类型在 Kotlin 中自由地与 JavaScript 交流,但是如果你想要 Kotlin 类型系统的全部威力 ,你可以为 JavaScript 库创建 Kotlin 头文件. 内联 J

  • C语言中联合体union的实例详解

     C语言中联合体union的实例详解 1.定义: union(int i, short s, char c) un; un.i = 3; printf("i=%d",un.i); printf("length = %d\n",sizeof(un);//==4,有最大的变量来决定 2.相当与java里的List T类型 3.数据交换 void swap(int *p , int *q){ int temp = *p; *p = *q; *q = temp; } 4.打

  • Java中的数组复制(clone与arraycopy)代码详解

    JAVA数组的复制是引用传递,而并不是其他语言的值传递. 1.clone protectedObjectclone() throwsCloneNotSupportedException创建并返回此对象的一个副本."副本"的准确含义可能依赖于对象的类.这样做的目的是,对于任何对象x,表达式: x.clone()!=x为true,表达式: x.clone().getClass()==x.getClass()也为true,但这些并非必须要满足的要求.一般情况下: x.clone().equa

  • Java语言中的内存泄露代码详解

    Java的一个重要特性就是通过垃圾收集器(GC)自动管理内存的回收,而不需要程序员自己来释放内存.理论上Java中所有不会再被利用的对象所占用的内存,都可以被GC回收,但是Java也存在内存泄露,但它的表现与C++不同. JAVA中的内存管理 要了解Java中的内存泄露,首先就得知道Java中的内存是如何管理的. 在Java程序中,我们通常使用new为对象分配内存,而这些内存空间都在堆(Heap)上. 下面看一个示例: public class Simple { public static vo

  • python正则表达式从字符串中提取数字的思路详解

    python从字符串中提取数字 使用正则表达式,用法如下: ## 总结 ## ^ 匹配字符串的开始. ## $ 匹配字符串的结尾. ## \b 匹配一个单词的边界. ## \d 匹配任意数字. ## \D 匹配任意非数字字符. ## x? 匹配一个可选的 x 字符 (换言之,它匹配 1 次或者 0 次 x 字符). ## x* 匹配0次或者多次 x 字符. ## x+ 匹配1次或者多次 x 字符. ## x{n,m} 匹配 x 字符,至少 n 次,至多 m 次. ## (a|b|c) 要么匹配

  • Go语言中的数据竞争模式详解

    目录 前言 Go在goroutine中通过引用来透明地捕获自由变量 切片会产生难以诊断的数据竞争 并发访问Go内置的.不安全的线程映射会导致频繁的数据竞争 Go开发人员常在pass-by-value时犯错并导致non-trivial的数据竞争 消息传递(通道)和共享内存的混合使用使代码变得复杂且易受数据竞争的影响 Add和Done方法的错误放置会导致数据竞争 并发运行测试会导致产品或测试代码中的数据竞争 小结 前言 本文主要基于在Uber的Go monorepo中发现的各种数据竞争模式,分析了其

随机推荐