上一篇:https://blog.csdn.net/qq_40088639/article/details/111562591
三、C语言求字符串的长度
1. sizeof()与strlen()的区别
(1) sizeof是运算符,求变量、数组或者数据类型在内存中的实际长度,这是在编译阶段就已经确定了的一个数值。它的参数可以是变量[普通变量,指针变量]、数组名或者数据类型。
示例程序1:
const char *str_ptr0 = "123456"; char ch_1 = '1'; char str_buff_2[]="123456789"; char str_buff_3[11]="123456789"; int dat_buff_4[5]={1,2,3,4,5};
int main(void) { printk("sizeof(str_ptr0) = %d", sizeof(str_ptr0)); printk ("sizeof(ch_1) = %d", sizeof(ch_1)); printk ("sizeof(str_buff_2) = %d", sizeof(str_buff_2)); printk ("sizeof(str_buff_3) = %d", sizeof(str_buff_3)); printk ("sizeof(dat_buff_4) = %d", sizeof(dat_buff_4));
return 0; } |
结果:
main: sizeof(str_ptr0) = 4 /* 指针变量,占4字节 */ main: sizeof(ch_1) = 1 /* char变量,1字节 */ main: sizeof(str_buff_2) = 10 /* 系统自动加上结束符,共占内存10字节 */ main: sizeof(str_buff_3) = 11 /* 定义时,就指定长度,占内存11字节 */ main: sizeof(dat_buff_4) = 20 /* 5个数,每个数用4字节来表示,共占20字节*/ |
示例程序2:
int main(void) { printk ("sizeof(int) = %d", sizeof(int)); printk ("sizeof(char) = %d", sizeof(char));
printk ("sizeof(int *) = %d", sizeof(int *)); printk ("sizeof(char *) = %d", sizeof(char *));
return 0; } |
结果:
main: sizeof(int) = 4 main: sizeof(char) = 1 main: sizeof(int *) = 4 main: sizeof(char *) = 4 |
sizeof()的参数可以是数据类型,所以还可以求构造类型[结构体、共用体和联合体]的长度及其变量的长度。
(2) strlen是一个函数,专门用于求字符串的长度,函数原型如下:
/** * * @brief Get string length * * @return number of bytes in string <s> */
size_t strlen(const char *s) { size_t n = 0;
while (*s != '\0') { s++; n++; }
return n; } |
注意,它的参数是一个字符型指针。给定一个入口地址,它就会连续不停地遍历内存上的值,停止条件为:碰到结束符’\0’。所以,可以将字符数组的数组名作为参数,或者一个字符指针作为参数[这两者都代表字符串的首地址]。
示例程序:
const char *str_ptr0 = "123456"; //内存:"123456\0" char str_buff_1[]="123456"; //内存:"123456\0" char str_buff_2[11]="123456"; //内存:"123456\0\0\0\0\0"
int main(void) { printk("strlen(str_ptr0) = %d", strlen(str_ptr0)); printk ("strlen(str_buff_1) = %d", strlen(str_buff_1)); printk ("strlen(str_buff_2) = %d", strlen(str_buff_2));
return 0; } |
结果:
main: strlen(str_ptr0) = 6 main: strlen(str_buff_1) = 6 main: strlen(str_buff_2) = 6 |
2. 错误地使用sizeof求数组长度
2.1 对于字符型数组
如果使用sizeof求数组长度,则会包含最后一个结束符。
示例程序:
char str_buff_1[] = "123456"; //内存: "123456\0"
int main(void) { for (int i = 0; i < sizeof(str_buff_1); i++) { printk("str_buff_1[%d] = %c", i, str_buff_1[i]); }
return 0; } |
结果:
main: str_buff_1[0] = 1 main: str_buff_1[1] = 2 main: str_buff_1[2] = 3 main: str_buff_1[3] = 4 main: str_buff_1[4] = 5 main: str_buff_1[5] = 6 main: str_buff_1[6]= // sizeof(str_buff_1)长度为7,包含最后一个结束符 |
所以,对于字符数组,应该使用strlen来求得字符串的实际长度,程序修改如下:
示例程序:
char str_buff_1[] = "123456"; //内存: "123456\0"
int main(void) { for (int i = 0; i < strlen(str_buff_1); i++) { // strlen(str_buff_1): 6 printk("str_buff_1[%d] = %c", i, str_buff_1[i]); }
return 0; } |
结果:
main: str_buff_1[0] = 1 main: str_buff_1[1] = 2 main: str_buff_1[2] = 3 main: str_buff_1[3] = 4 main: str_buff_1[4] = 5 main: str_buff_1[5] = 6 |
2.2 对于非字符型数组
对于非字符型数组,使用sizeof求数组元素个数的时候,跟具体的类型有关,错误的使用示例程序:
int dat_buff[5]={0, 1, 2, 3, 4};
int main(void) { for (int i = 0; i < sizeof(dat_buff); i++) { printk("dat_buff[%d] = %d", i, dat_buff[i]); }
return 0; } |
结果:
因为sizeof(dat_buff)的结果是20 [ 5 * 4字节 ],不是5,循环了20次。
正确求数组长度的方法:len = sizeof(数组名)/sizeof(元素类型)。
这个方法很好理解,sizeof(数组名)是编译阶段确定的内存大小,它是一片连续的内存块,大小等于数据个数(len)乘以每一个数据元素的字节大小。即:sizeof(数组名) = len * sizeof(元素类型),所以:len = sizeof(数组名)/sizeof(元素类型)
程序修改后,如下:
int dat_buff[5]={0, 1, 2, 3, 4};
int main(void) { for (int i = 0; i < sizeof(dat_buff)/sizeof(int); i++) { printk("dat_buff[%d] = %d", i, dat_buff[i]); }
return 0; } |
正确的运行结果: