一、strlen的用法
strlen
函数是C++中(继承自C语言)用于获取字符串长度的函数。它定义在<cstring>
头文件中(C语言中为<>
),并计算给定字符串的长度,不包括结束字符(null terminator)‘\0'
。strlen
的原型如下:
size_t strlen(const char* str);
参数str
是指向以空字符结尾的字符数组(即C风格字符串)的指针。strlen
返回从str
指向的地址起(包括此地址)直到首个空字符前的字符个数,不计入空字符。返回类型size_t
是无符号整数类型,确保能表示任何可能的数组索引。
使用
strlen
时,非常重要的一点是确保传递给它的字符串是以'\0'
结尾的。如果传递给strlen
的指针指向的数据不是一个合法的以'\0'
结尾的字符串,那么strlen
将会继续在内存中向后读取,直到偶然遇到'\0'
。这可能导致未定义行为,包括读取随机数据或崩溃。
下面是一个使用strlen的实例:
#include <iostream>
#include <cstring> // 注意在C++中使用<cstring>头文件
int main() {
const char* myString = "Hello, World!";
std::cout << "The length of myString is: " << strlen(myString) << std::endl;
return 0;
}
输出结果:
The length of myString is: 13
但是这里看起来只有十二个字符,为什么是13呢
因为:
字符串
"Hello, World!"
共包含 13 个可打印字符,它们分别是:
- H
- e
- l
- l
- o
- ,
- (一个空格)
- W
- o
- r
- l
- d
- !
当调用 strlen(myString)
时,会计算这些可打印字符的数量,不包括最后的空字符 \0
。结果正好是 13,这个数字反映了字符串中字符的总数。在 C 和 C++ 中,C-风格字符串总是以空字符(null terminator)\0
结尾,但是此终止字符不计入由 strlen
返回的长度中。
记住,
strlen
只能用于C风格的字符串。对于C++中的std::string
对象,应使用它的成员函数length()
或size()
获得字符串长度,这两个函数在实际使用中是等价的。
std::string myStr = "Hello, World!";
std::cout << "The length of myStr is: " << () << std::endl;
输出结果也是13
二、length()和size()函数的区别
既然在C++中可以用length和size,那么在C++中length()和size(),有什么区别吗
在C++标准库中,
std::string
类提供了length()
和size()
这两个成员函数,用于返回字符串的长度。实际上,对于std::string
对象,length()
和size()
之间没有区别,它们都返回字符串中字符的数量(不包括末尾的空字符)。
这种设计主要是为了保持与其他容器类的一致性。在C++标准库中,许多容器(如
std::vector
、std::array
、std::deque
等)都提供了size()
成员函数来返回容器中元素的数量。然而,由于std::string
本质上被视为一个字符的序列,所以提供了length()
函数,其意义上更贴近于字符串的“长度”概念。为了保持接口的一致性和方便使用,std::string
同时提供了size()
函数,使其在使用上与其他容器类似。
简而言之,std::string
的length()
和size()
在功能上是等价的,没有差异。你可以根据上下文或个人偏好选择其中一个使用。
示例代码:
#include <iostream>
#include <string>
int main() {
std::string myStr = "Hello, World!";
std::cout << "The length of myStr is: " << () << std::endl;
std::cout << "The size of myStr is: " << () << std::endl;
return 0;
}
The length of myStr is: 13
The size of myStr is: 13
另外,
strlen
是一个 C 语言标准库函数,它用于计算字符串的长度,需要包含<cstring>
头文件C++ 标准库中的
std::string
类提供了length()
和size()
方法来获取字符串的长度,不需要引入额外的标准库,只需要包含<string>
头文件即可
三、std::的使用
在常规的编程中我们一般不会看见"std::"出现在代码中,那这是什么东西,为什么要使用它呢
在C++中,‘std’是标准库的命名空间。命名空间是用来组织代码的一种方式,以防止名称冲突,即不同库中的同名函数、类或变量相互干扰。标准库的所有标识符(如函数名、类名等)都定义在‘std’命名空间中。因此,当你使用标准库中的任何功能时,如'cout'、'cin'、'string'等,你需要指明这些标识符属于'std'命名空间。
使用'std::'前缀的原因主要有两个:
1. 避免名称冲突:这是使用命名空间的主要原因。如果你的程序或者你使用的其他库定义了与标准库相同名称的类或函数(例如,你定义了自己的`vector`类),使用'std::'前缀可以明确指出你是想使用标准库中的'vector',而不是自定义的。
2. 明确和一致性:在代码中使用'std::'前缀可以直观地表明你正使用标准库中的某个功能。这让代码的阅读者一目了然,同时保持了代码的一致性。
如果觉得在每次使用标准库的时候都写'std::'太麻烦,C++允许使用'using namespace std;'语句来避免重复编写'std::'。这样,之后的代码中就可以直接使用不带'std::'前缀的标识符了。然而,这种做法在大型项目或者库的代码中通常是不推荐的,因为它增加了名称冲突的风险,并且降低了代码的清晰度。
为了保持代码的清晰度和减少潜在的命名冲突,许多C++程序员和项目依然倾向于显式使用'std::'前缀来引用标准库中的元素。