C: strlen的用法,length()和size()函数的区别,std::的使用

一、strlen的用法

strlen函数是C++中(继承自C语言)用于获取字符串长度的函数。它定义在<cstring>头文件中(C语言中为<string.h>),并计算给定字符串的长度,不包括结束字符(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 个可打印字符,它们分别是:

  1. H
  2. e
  3. l
  4. l
  5. o
  6. ,
  7. (一个空格)
  8. W
  9. o
  10. r
  11. l
  12. d
  13. !

当调用 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: " << myStr.length() << std::endl;

 输出结果也是13

二、length()和size()函数的区别

既然在C++中可以用length和size,那么在C++中length()和size(),有什么区别吗

在C++标准库中,std::string类提供了length()size()这两个成员函数,用于返回字符串的长度。实际上,对于std::string对象,length()size()之间没有区别,它们都返回字符串中字符的数量(不包括末尾的空字符)。

这种设计主要是为了保持与其他容器类的一致性。在C++标准库中,许多容器(如std::vectorstd::arraystd::deque等)都提供了size()成员函数来返回容器中元素的数量。然而,由于std::string本质上被视为一个字符的序列,所以提供了length()函数,其意义上更贴近于字符串的“长度”概念。为了保持接口的一致性和方便使用,std::string同时提供了size()函数,使其在使用上与其他容器类似。

简而言之,std::stringlength()size()在功能上是等价的,没有差异。你可以根据上下文或个人偏好选择其中一个使用。

示例代码:

#include <iostream>
#include <string>

int main() {
    std::string myStr = "Hello, World!";
    std::cout << "The length of myStr is: " << myStr.length() << std::endl;
    std::cout << "The size of myStr is: " << myStr.size() << 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::'前缀来引用标准库中的元素。

  • 27
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这四个函数的作用都与获取数据的长度有关,但具体用法和适用范围有所不同。 1. sizeof() sizeof() 是 C/C++ 的一个操作符,用于获取数据类型或变量在内存所占的字节数。例如: ```c++ int a; size_t size = sizeof(a); ``` 这里 size 变量的值为 4,因为 int 类型在大多数系统上占用 4 个字节。 2. strlen() strlen() 是 C/C++ 的一个函数,用于获取字符串的长度,不包括字符串末尾的 null 字符。例如: ```c++ char str[] = "hello"; size_t length = strlen(str); ``` 这里 length 变量的值为 5,因为 "hello" 这个字符串共有 5 个字符。 3. length() length() 是 C++ STL 的一个函数,用于获取容器(如 std::string、std::vector 等)元素的个数。例如: ```c++ std::string str = "hello"; size_t length = str.length(); ``` 这里 length 变量的值为 5,因为 "hello" 这个字符串共有 5 个字符。 4. size() size() 是 C++ STL 的一个函数,用于获取容器(如 std::string、std::vector 等)元素的个数。与 length() 函数相似,但返回值类型不同,size() 函数返回的是一个无符号整数类型(如 size_t),而 length() 函数返回的是一个有符号整数类型(如 int)。例如: ```c++ std::vector<int> vec = {1, 2, 3, 4, 5}; size_t vec_size = vec.size(); ``` 这里 vec_size 变量的值为 5,因为 vec 容器共有 5 个元素。 总结: | 函数/操作符 | 适用范围 | 返回值类型 | 作用 | | --- | --- | --- | --- | | sizeof() | 任何数据类型或变量 | 无符号整数类型(如 size_t) | 获取数据类型或变量在内存所占的字节数 | | strlen() | 字符串 | 无符号整数类型(如 size_t) | 获取字符串的长度 | | length() | 容器(如 std::string、std::vector 等) | 有符号整数类型(如 int) | 获取容器元素的个数 | | size() | 容器(如 std::string、std::vector 等) | 无符号整数类型(如 size_t) | 获取容器元素的个数 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值