目录
一.sizeof与strlen的应用与不同
对于字符串的求解长度问题,常见的两种方法为使用sizeof或使用strlen两种方式来的到目标字符串的长度。对于此两种算法我们进行一下辨别区分与原理探究。
首先明确字符串的构成,在C语言中并没有字符串的定义类型,经常使用的方法为定义一个字符型数组来存储字符串内容(常见的定义方式格式如下),字符串本质上为以”\0"结尾的特殊字符数组。
char 字符串名称[] = "字符串内容";
例如:char arr[] = "helloworld";(建议使用)
char 字符串名称[长度] = {'字符串内容',.....};
例如:char name[3] = {'t','o','m'};
char 字符串名称[] = {'字符串内容',.....};
例如:char name[] = {'t','o','m'};
strlen为包含于<string.h>头文件中的函数,参数类型为一个字符串,返回值类型为int类型的整型常量,用于返回目标字符串的有效长度,即不包括”\0",值得注意的是,在使用strlen函数使需要在主函数前进行头文件<string.h>的调入.
#include<stdio.h>
#include<string.h>
void main()
{
char arr2[] = "hello,world";
char arr2[] = "hello,world\0";
printf("length = %d",strlen(arr1));
printf("length = %d",strlen(arr2));
}
//该函数两次执行结果为11
//故采用strlen函数求解字符串的长度时,不将结尾处“\0"计算入字符串长度
关键字sizeof为一个单目运算符,而不是一个函数。与strlen函数不同的是,sizeof的参数可以是数组,指针,类型,函数等,返回值为int类型的整型常量,用于返回目标对象的长度,该运算方式在运算时会将字符串结尾的“\0"结束标识计入字符串长度,用sizeof计算字符串长度即在strlen函数返回的字符串长度的基础上+1.
#include<stdio.h>
void main()
{
char arr1[] = "hello,world";
printf("sizeof:%d\n",sizeof(arr1));
}
//该程序的执行结果结果为12
//故采用sizeof计算字符串长度时,会将字符串结尾默认添加的”\0"记作一个字节长度加入最终结果
二.转义字符
附上一些常用的转义字符
\? 在书写连续多个问号时使用,防止他们被解析成三字母词
\' 用于表示字符常量'
\“ 用于表示一个字符串内部的双引号\\ 用于表示一个反斜杠,防止它被解释为一个转义序列符\b 退格符\n 换行\t 水平制表符\ddd ddd 表示 1~3 个八进制的数字\xdd dd 表示 2 个十六进制数字
在采用上述两种方法计算目标字符串的长度时,计算机系统会对字符串内容进行分析,会先对字符串内容中的转义字符进行检测,并不是单纯的计算字符串中的字符个数,而是将字符串内容中的转义字符当作一个字符来计算,对此需要注意。
三.具体问题分析
在讲解了上述的两个内容之后,将目光转到题目中所提及的问题:计算“C:\text\161"的字符长度。
我们先采用上述所讲解的两种求字符串长度的方式来在代码中计算该字符串长度。
#include<stdio.h>
#include<string.h>
void main()
{
char arr[] = "C:\text\161";
printf("sizeof = %d\n", sizeof(arr));
printf("length = %d", strlen(arr));
}
/*
该程序的执行结果为:
sizeof = 8
length = 7
*/
字符串 "C:\text\161"在分析完转义字符后,可以理解为”C“ ,”:","\t","e","x","t","\161".
其中 ”\t" , "\161"为转义字符,“\t"为水平制表符,”\161"表示三个八进制数,均为一个字节长度。
故该字符串的有效长度为7.