STL取随机字符串

std::string strrnd(size_t i)
{
	std::string s = "";
	std::uniform_int_distribution<int> rng('!', 'z');

	for (; i > 0; i--)
		s += rng(std::random_device());

	return s;
}
<think>我们讨论的是C++中获字符串长度的方法。根据引用内容,主要有以下几种方法: 1. 对于C风格的字符串(以空字符'\0'结尾的字符数组),使用strlen()函数,需要包含头文件<cstring>。 2. 对于C++的string类对象,可以使用length()成员函数或size()成员函数,它们返回的是字符串的实际长度(不包括结束符'\0')。 3. 另外,引用中还提到使用迭代器和distance函数来计算长度,这种方法也可以用于string对象,但不如直接使用length()或size()方便。 4. 注意:sizeof运算符用于获对象在内存中所占的字节数,对于string对象,它返回的是该对象的大小(即类内部数据结构的大小,通常固定),而不是字符串内容的长度。因此,不能使用sizeof来获字符串内容的长度。 另外,对于C风格字符串,使用sizeof(数组名)可以获整个数组的大小(包括结束符),但如果是字符指针,则sizeof(指针)得到的是指针的大小。 总结如下: 方法一:使用strlen函数(适用于C风格字符串) 方法二:使用string类的length()或size()成员函数(适用于string对象) 方法三:使用迭代器(适用于string对象,但不常用) 注意:不要混淆sizeof运算符,它用于获内存大小,而不是字符串长度。 下面给出示例代码说明: 示例1:C风格字符串 ```cpp #include <iostream> #include <cstring> // for strlen using namespace std; int main() { char str[] = "Hello, World!"; // 字符数组 const char* cstr = "Hello, World!"; // 字符指针(C风格字符串) // 使用strlen cout << "strlen(str): " << strlen(str) << endl; // 13 cout << "strlen(cstr): " << strlen(cstr) << endl; // 13 // 使用sizeof(数组名): 返回整个数组的大小(包括空字符) cout << "sizeof(str): " << sizeof(str) << endl; // 14(因为包含结束符'\0') // 指针的大小 cout << "sizeof(cstr): " << sizeof(cstr) << endl; // 通常是4或8(指针的大小) return 0; } ``` 示例2:string类对象 ```cpp #include <iostream> #include <string> using namespace std; int main() { string str = "Hello, World!"; // 使用length() cout << "str.length(): " << str.length() << endl; // 13 // 使用size() cout << "str.size(): " << str.size() << endl; // 13 // 使用迭代器(不常用) cout << "distance: " << distance(str.begin(), str.end()) << endl; // 13 // sizeof(string) - 返回的是string对象本身在内存中的大小,而不是字符串长度 cout << "sizeof(str): " << sizeof(str) << endl; // 决于编译器,通常是固定大小(如32位下可能是28字节等) return 0; } ``` 注意事项: 1. 对于string对象,length()和size()是完全等价的,它们返回的是同一个值。根据标准,length()是为了与字符串的传统概念保持一致,而size()是为了与STL容器保持一致。 2. 使用迭代器计算长度的方法也可以,但效率上不如length()或size(),因为distance对于随机访问迭代器的复杂度是常数,但这里使用它只是为了展示另一种方法。 因此,在C++中,推荐使用string类的length()或size()来获字符串长度,而对于C风格字符串则使用strlen()。 生成相关问题: §§相关问题§§ 1. 为什么C++的string类同时提供了length()和size()方法? 2. 除了length()和size(),还有哪些方法可以获string对象的字符数量? 3. 如何正确获包含中文字符的字符串长度? 4. 在C++中,如何处理Unicode字符串的长度计算? </think>在 C++ 中获字符串长度主要有以下几种方法,根据字符串类型和处理需求可选择不同方案: ### 一、C 风格字符串(字符数组) ```cpp #include <cstring> // 包含头文件 int main() { char c_str[] = "Hello"; // C 风格字符串 size_t len = strlen(c_str); // 获长度 cout << "长度:" << len << endl; // 输出 5 return 0; } ``` **特点**: 1. 适用于以 `'\0'` 结尾的字符数组 2. 返回有效字符长度(不包括结束符) 3. 头文件:`<cstring>` 或 `<string.h>`[^1] ### 二、C++ string 类对象 ```cpp #include <string> int main() { string str = "Hello, World!"; // string 对象 // 方法 1:length() size_t len1 = str.length(); // 方法 2:size() size_t len2 = str.size(); cout << len1 << " " << len2; // 两者都输出 13 return 0; } ``` **特点**: 1. `length()` 和 `size()` 完全等价,都返回字符数量[^2] 2. 不包含结束符 `'\0'` 3. 时间复杂度 O(1),直接读内部计数 4. 适用于 C++ 标准库的 `std::string` 类型[^2][^3] ### 三、迭代器方法(较不常用) ```cpp #include <string> #include <iterator> int main() { string str = "Example"; size_t len = distance(str.begin(), str.end()); cout << "长度:" << len; // 输出 7 return 0; } ``` **特点**: 1. 适用于需要遍历字符串的场景 2. `begin()` 返回起始迭代器,`end()` 返回末尾迭代器 3. `std::distance` 计算两个迭代器之间的元素数[^1] ### 四、sizeof 运算符(需谨慎使用) ```cpp int main() { char arr[] = "Hello"; cout << sizeof(arr); // 输出 6 (包含 '\0') } ``` **注意事项**: 1. 返回变量在内存中的总字节数 2. 对字符数组返回 `字符数 + 1`(包含结束符) 3. 对 string 对象返回固定大小(通常是 24/32 字节),**不是字符串长度**[^3] 4. **不推荐**用于获字符串内容长度 ### 关键区别总结 | 方法 | 适用对象 | 包含结束符 | 时间复杂度 | |--------------------|------------------|------------|------------| | `strlen()` | C 风格字符串 | ❌ | O(n) | | `string::length()` | std::string | ❌ | O(1) | | `string::size()` | std::string | ❌ | O(1) | | `sizeof()` | 字符数组/变量 | ✔️ | O(1) | | 迭代器距离 | std::string | ❌ | O(n) | > **最佳实践**: > - C 风格字符串 → `strlen()` > - C++ string 对象 → `length()` 或 `size()` > - 避免使用 `sizeof` 获内容长度
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值