C语言中strlen和sizeof函数有何本质区别?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1043个文字,预计阅读时间需要5分钟。
关于`strlen`和`sizeof`的区别,很多程序员容易混淆它们的功能。从表面上看,它们都可以用来获取字符串的长度,但它们存在一些关键的不同之处。
首先,`strlen`是一个函数,用于计算指定字符串的长度(不包括结尾的空字符`\0`)。例如:
c#include #include
int main() { char str[]=Hello, World!; printf(strlen(str)=%ld\n, strlen(str)); return 0;}
而`sizeof`是一个操作符,它返回一个对象或类型的大小,以字节为单位。对于字符串数组,`sizeof`会返回整个数组的大小,包括字符串结尾的空字符。例如:
c#include
int main() { char str[]=Hello, World!; printf(sizeof(str)=%zu\n, sizeof(str)); return 0;}
在这个例子中,`sizeof(str)`的结果会包括结尾的空字符`\0`,所以通常会比`strlen(str)`的结果大1。
总结来说,`strlen`和`sizeof`在计算字符串长度时有不同的用途和结果。了解这些区别对于编写正确的代码至关重要。
对于 strlen 和 sizeof,相信不少程序员会混淆其功能。虽然从表面上看它们都可以求字符串的长度,但二者却存在着许多不同之处及本质区别。strlen 是一个函数,它用来计算指定字符串 str 的长度,但不包括结束字符(即 null 字符)。其原型如下面的代码所示:
size_t strlen(char const* str);
也正因为 strlen 是一个函数,所以需要进行一次函数调用,调用示例如下面的代码所示:
char sArr[] = "ILOVEC";
/*用strlen()求长度*/
printf("sArr的长度=%d\n", strlen(sArr));
很显然,上面示例代码的运行结果为 6(因为不包括结束字符 null)。这里需要特别注意的是,函数 strlen 返回的是一个类型为 size_t 的值,从而有可能让程序导致意想不到的结果,如下面的示例代码所示:
/*判断一*/
if(strlen(x)>= strlen(y))
{
}
/*判断二*/
if(strlen(x)- strlen(y)>= 0)
{
}
从表面上看,上面的两个判断表达式完全相等,但实际情况并非如此。其中,判断表达式一没什么问题,程序也能够完全按照预想的那样工作;但判断表达式二的结果就不一样了,它将永远是真,这是为什么呢?
原因很简单,因为函数 strlen 的返回结果是 size_t 类型(即无符号整型),而 size_t 类型绝不可能是负的。因此,语句“if(strlen(x)-strlen(y)>=0)”将永远为真。
同样,就算表达式中同时包含了有符号整数和无符号整数,还是有可能产生意想不到的结果,如下面的代码所示:
/*判断一*/
if(strlen(x)>= 5)
{
}
/*判断二*/
if(strlen(x)- 5>=0)
{
}
很显然,判断表达式二的结果还是永远是真,其原因与上面相同。
关键字 sizeof 是一个单目运算符,而不是一个函数。与函数 strlen 不同,它的参数可以是数组、指针、类型、对象、函数等,如下面的示例代码所示:
char sArr[] = "ILOVEC"; /*用sizeof求长度*/ printf("sArr的长度=%d\n", sizeof(sArr)); 相对于函数 strlen,这里的示例代码运行结果为 7(因为它包括结束字符 null)。同时,对 sizeof 而言,因为缓冲区已经用已知字符串进行了初始化,其长度是固定的,所以 sizeof 在编译时计算缓冲区的长度。也正是由于在编译时计算,因此 sizeof 不能用来返回动态分配的内存空间的大小。
本文共计1043个文字,预计阅读时间需要5分钟。
关于`strlen`和`sizeof`的区别,很多程序员容易混淆它们的功能。从表面上看,它们都可以用来获取字符串的长度,但它们存在一些关键的不同之处。
首先,`strlen`是一个函数,用于计算指定字符串的长度(不包括结尾的空字符`\0`)。例如:
c#include #include
int main() { char str[]=Hello, World!; printf(strlen(str)=%ld\n, strlen(str)); return 0;}
而`sizeof`是一个操作符,它返回一个对象或类型的大小,以字节为单位。对于字符串数组,`sizeof`会返回整个数组的大小,包括字符串结尾的空字符。例如:
c#include
int main() { char str[]=Hello, World!; printf(sizeof(str)=%zu\n, sizeof(str)); return 0;}
在这个例子中,`sizeof(str)`的结果会包括结尾的空字符`\0`,所以通常会比`strlen(str)`的结果大1。
总结来说,`strlen`和`sizeof`在计算字符串长度时有不同的用途和结果。了解这些区别对于编写正确的代码至关重要。
对于 strlen 和 sizeof,相信不少程序员会混淆其功能。虽然从表面上看它们都可以求字符串的长度,但二者却存在着许多不同之处及本质区别。strlen 是一个函数,它用来计算指定字符串 str 的长度,但不包括结束字符(即 null 字符)。其原型如下面的代码所示:
size_t strlen(char const* str);
也正因为 strlen 是一个函数,所以需要进行一次函数调用,调用示例如下面的代码所示:
char sArr[] = "ILOVEC";
/*用strlen()求长度*/
printf("sArr的长度=%d\n", strlen(sArr));
很显然,上面示例代码的运行结果为 6(因为不包括结束字符 null)。这里需要特别注意的是,函数 strlen 返回的是一个类型为 size_t 的值,从而有可能让程序导致意想不到的结果,如下面的示例代码所示:
/*判断一*/
if(strlen(x)>= strlen(y))
{
}
/*判断二*/
if(strlen(x)- strlen(y)>= 0)
{
}
从表面上看,上面的两个判断表达式完全相等,但实际情况并非如此。其中,判断表达式一没什么问题,程序也能够完全按照预想的那样工作;但判断表达式二的结果就不一样了,它将永远是真,这是为什么呢?
原因很简单,因为函数 strlen 的返回结果是 size_t 类型(即无符号整型),而 size_t 类型绝不可能是负的。因此,语句“if(strlen(x)-strlen(y)>=0)”将永远为真。
同样,就算表达式中同时包含了有符号整数和无符号整数,还是有可能产生意想不到的结果,如下面的代码所示:
/*判断一*/
if(strlen(x)>= 5)
{
}
/*判断二*/
if(strlen(x)- 5>=0)
{
}
很显然,判断表达式二的结果还是永远是真,其原因与上面相同。
关键字 sizeof 是一个单目运算符,而不是一个函数。与函数 strlen 不同,它的参数可以是数组、指针、类型、对象、函数等,如下面的示例代码所示:
char sArr[] = "ILOVEC"; /*用sizeof求长度*/ printf("sArr的长度=%d\n", sizeof(sArr)); 相对于函数 strlen,这里的示例代码运行结果为 7(因为它包括结束字符 null)。同时,对 sizeof 而言,因为缓冲区已经用已知字符串进行了初始化,其长度是固定的,所以 sizeof 在编译时计算缓冲区的长度。也正是由于在编译时计算,因此 sizeof 不能用来返回动态分配的内存空间的大小。

