【UE4学习】22_C++输出字符串及FString字符串转换

本文详细介绍了在Unreal Engine 4(UE4)中使用C++进行字符串操作,包括如何将FString输出到Output Log和屏幕,以及各种类型的字符串转换,如FString与FName、std::string之间的互换,还有与Integer、Float之间的转换。同时,还提到了FArrayReaderPtr、Array和FText等类型的转换,并给出了相关源代码头文件的引用作为参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


C++输出字符串

输出字符串到output log中

FString filePath
UE_LOG(LogTemp, Log, TEXT("%s"), *filePath);

UE_LOG(LogTemp, Error, TEXT("Hello,World!"));

输出字符串到屏幕上

FString filePath;
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FString::Printf(TEXT("DLL_Init")));

GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FString::Printf(TEXT("%s"), *filePath));

字符串转换

Converting FString to FNames

FString TheString = "UE4_C++_IS_Awesome";
FName ConvertedFString = FName(*TheString);

Converting std::string to FString

#include <string>

//....
std::string TestString = "Happy"; 
FString HappyString(TestString.c_str());

Converting FString to std::string

#include <string>

//....
FString UE4Str = "Flowers";
std::string MyStdString(TCHAR_TO_UTF8(*UE4Str));
<think>我们正在处理一个关于在C++中将字符串转换为小写的问题。根据用户的问题,我们需要提供几种方法来实现这个功能。参考引用[2]和[3]中提供了一些代码示例,我们可以借鉴这些方法并给出清晰的解释。方法一:使用标准库函数std::tolower和循环(范围for循环)方法二:使用std::for_each算法方法三:使用std::transform算法此外,我们还需要注意,直接使用::tolower可能会遇到字符编码的问题,特别是当字符为负数时(例如扩展ASCII字符)。因此,安全的方式是将字符转换为unsignedchar再传递给tolower。另外,引用[3]中展示了一个完整的程序,它根据字符串中大写字母的数量来决定将整个字符串转换为大写还是小写。但用户明确要求转换为小写,所以我们只需关注转换为小写的方法。我们将提供三种常见的方法,并给出代码示例。注意:在C++中,标准库中的tolower函数有两个版本:1.在<ctype.h>中定义的inttolower(int ch),它接受一个int(字符的ASCII值)并返回转换后的int。2.在<locale>中定义的模板函数,但我们这里主要使用第一种。由于字符串可能包含非ASCII字符,为了安全起见,我们使用static_cast<unsigned char>来转换字符,然后再传递给tolower。步骤:1.使用范围for循环遍历字符串,对每个字符应用tolower(注意转换)。2.使用std::for_each算法,结合lambda表达式。3.使用std::transform算法,这是最简洁的方式。我们按照上述方法编写代码示例。另外,引用[4]提到了UE中的FString,但用户没有提到UE,所以我们只讨论标准C++字符串std::string。现在,我们开始组织回答。</think>### 在 C++ 中将字符串转换为小写的方法 在 C++ 中,将字符串转换为小写有多种实现方式,以下是三种常用方法及其代码示例: #### **方法 1:使用范围 for 循环** ```cpp #include <cctype> // tolower #include <string> #include <iostream> char toLowerCase(char c) { // 仅转换 A-Z 范围的大写字母 if (c >= 'A' && c <= 'Z') { return c + 32; // ASCII 值增加 32 } return c; } int main() { std::string str = "HeLLo C++"; for (auto& c : str) { // 遍历每个字符 c = toLowerCase(c); } std::cout << str; // 输出: hello c++ } ``` **原理**: - 通过 ASCII 码差值(`'a' - 'A' = 32`)直接转换[^2] - 仅处理 `A-Z` 范围,其他字符(如数字、符号)保持不变 #### **方法 2:使用 `std::transform` 算法** ```cpp #include <algorithm> // transform #include <cctype> // tolower #include <string> int main() { std::string str = "PROGRAMMING"; std::transform(str.begin(), str.end(), str.begin(), [](unsigned char c) { return std::tolower(c); } ); // 输出: programming } ``` **优势**: - 单行代码完成转换,简洁高效 - 使用标准库函数 `std::tolower` 确保编码安全[^2] - `unsigned char` 转换避免负值字符的未定义行为 #### **方法 3:使用 `tolower` 函数遍历** ```cpp #include <cctype> #include <string> #include <iostream> int main() { std::string s = "C++ STRING"; for (int i = 0; i < s.size(); i++) { s[i] = std::tolower(static_cast<unsigned char>(s[i])); } std::cout << s; // 输出: c++ string } ``` **关键点**: - `static_cast<unsigned char>` 确保非 ASCII 字符安全处理[^3] - 直接修改原字符串,无需额外内存 ### **注意事项** 1. **编码兼容性** - 优先使用 `std::tolower`(来自 `<cctype>`)而非 C 语言的 `tolower` - 转换前用 `unsigned char` 类型处理扩展字符集(如拉丁字母) 2. **性能对比** | 方法 | 适用场景 | 时间复杂度 | |--------------|------------------|------------| | 范围 for 循环 | 简单转换 | O(n) | | std::transform| 需要链式操作时 | O(n) | | 下标遍历 | 需索引定位的场景 | O(n) | 3. **Unicode 支持** 若需处理多语言文本(如中文拼音、俄文),请使用 `<locale>` 库: ```cpp std::locale loc; std::transform(str.begin(), str.end(), str.begin(), [&loc](char c) { return std::tolower(c, loc); } ); ``` ### **常见问题** **Q:为什么 `c + 32` 比 `tolower` 更快?** A:直接计算避免函数调用开销,但仅适用于纯 ASCII 环境。现代编译器对 `tolower` 的优化已大幅缩小差距[^2]。 **Q:如何只转换部分字符?** A:在循环中添加条件判断: ```cpp for (auto& c : str) { if (c >= 'A' && c <= 'Z') // 仅处理大写字母 c = toLowerCase(c); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值