阿赵UE引擎C++编程学习笔记——字符串操作

  大家好,我是阿赵
  之前在介绍了UE的log打印。打印输入的参数是字符串。这里来学习一下,UE里面字符串有哪些类型,还有一些常用的字符串处理方法。

一、 FName、FString、FText

1、 三种格式的介绍

  在打印方法里面,输入的字符串的格式其实都是FString。但UE里面还有另外两种表达字符串的类型。
1. FName:最轻量化,表示名称用,不可更改。引擎里面的资源名称用。
2. FString:最接近std::string的类型,可以修改,提供各种方法,平时正常使用的字符串类型。
3. FText:带有很多功能,但不可更改,用于显示文本。还有UE自带的多语言收集功能。
  FString是唯一可以修改的类型,平时写代码的时候,逻辑上使用的类型。

2、 三种格式的创建:

1. FName

FName nameVal = "this is a FName val";
FName nameVal = L"this is a FName val";
FName nameVal = TEXT("this is a FName val");

2. FString

FString stringVal = "this is a FString val";
FString stringVal = L"this is a FString val";
FString stringVal = TEXT("this is a FString val");

3. FText

FText textVal1 = FText();
FText textVal2 = FText::GetEmpty();
FText textVal3 = NSLOCTEXT("test", "FTextVal", "this is a FTest val");

第一个参数是namespace,代表着这个FText的用途
第二个参数是key,代表着这个FText的id
第三个参数是实际显示的字符串内容

  创建字符串的时候,可以直接双引号包含字符串,也可以前面加L,或者用TEXT宏来包裹。如果直接用字符串,会存在中文编码问题,其他两种,会转Unicode。在UE里面,习惯都使用TEXT宏来包裹字符串。

3、 互相转换

1. FName转其他

FName转FString

FName nameVal = TEXT("this is a FName val");
FString stringVal = nameVal.ToString();

FName转FText

FName nameVal = TEXT("this is a FName val");
FText textVal = FText::FromName(nameVal);

2. FString转其他

FString转FName

FString stringVal = TEXT("this is a FString val");
FName nameVal = FName(*stringVal);

FString转FText

FString stringVal = TEXT("this is a FString val");
FText textVal = FText::FromString(stringVal);

3. FText转其他

FText转FString

FText textVal = NSLOCTEXT("test", "FTextVal", "this is a FTest val");
FString stringVal = textVal.ToString();

这时候打印stringVal,会显示"this is a FTest val"
FText转FName
没有直接转换方法,需要先转FString,再转FName

FText textVal = NSLOCTEXT("test", "FTextVal", "this is a FTest val");
FString stringVal = textVal.ToString();
FName nameVal = FName(*stringVal);

二、 FString操作

1、 对比

1. 等号

FString val1 = TEXT("val1");
FString val2 = TEXT("val2");
bool isEqual = (val1 == val2);

2. equal

FString val1 = TEXT("val1");
FString val2 = TEXT("val2");
bool isEqual = val1.Equals(val2);
//考虑大小写
FString val1 = TEXT("val1");
FString val2 = TEXT("val2");
bool isEqual = val1.Equals(val2, ESearchCase::CaseSensitive);
//忽略大小写
FString val1 = TEXT("val1");
FString val2 = TEXT("Val1");
bool isEqual = val1.Equals(val2, ESearchCase::IgnoreCase);

3. 比较大小

FString val1 = TEXT("123");
FString val2 = TEXT("456");
int compareResult = val1.Compare(val1);

大于:1
等于:0
小于:-1

2、 拼接

1.加号连接

FString val1 = TEXT("val1");
FString val2 = TEXT("val2");
FString val3 = val1 + val2;

2. Append连接

FString val1 = TEXT("val1");
FString val2 = TEXT("val2");
FString val3 = val1.Append(*val2);

3、 判空

FString stringVal = FString("");
stringVal.IsEmpty()

4、 清空

FString stringVal = FString(TEXT("abcde"));
stringVal.Empty();

5、 Trim

1.赋值:

FString stringVal1 = FString(TEXT("\t\rabcdefg\t\r  "));
FString stringVal2 = stringVal1.TrimStartAndEnd();
//FString stringVal2 = stringVal1.TrimStart();
//FString stringVal2 = stringVal1.TrimEnd();

2.改变自身:

FString stringVal1 = FString(TEXT("\t\rabcdefg\t\r  "));
stringVal1.TrimStartAndEndInline();
//stringVal1.TrimStartInline();
//stringVal1.TrimEndInline();

6、 取长度

FString stringVal = FString(TEXT("abcde"));
int len = stringVal.Len();

7、 是否包含

判断包含

FString stringVal1 = FString(TEXT("abcde"));
FString stringVal2 = FString(TEXT("bc"));
bool isContains = stringVal1.Contains(stringVal2);

查找子字符串位置

FString stringVal1 = FString(TEXT("abcde"));
FString stringVal2 = FString(TEXT("bc"));
int index = stringVal1.Find(stringVal2);

查找子字符串开头

FString stringVal1 = FString(TEXT("abcde"));
FString stringVal2 = FString(TEXT("abc"));
bool result = stringVal1.StartsWith(stringVal2);

查找子字符串结尾

FString stringVal1 = FString(TEXT("abcde"));
FString stringVal2 = FString(TEXT("de"));
bool result = stringVal1.EndsWith(stringVal2);

8、 格式化

1. FString::Printf

float floatVal = 1.5f;
int intVal = 4;
FString stringVal = TEXT("aaa");
FString newString = FString::Printf(TEXT("浮点:%f,整型:%d,字符串:%s"), floatVal, intVal, *stringVal);

2. FString::Format

按顺序

float floatVal = 1.5f;
int intVal = 4;
FString stringVal = TEXT("aaa");
TArray<FStringFormatArg> args;
args.Add(floatVal);
args.Add(intVal);
args.Add(*stringVal);
FString newString = FString::Format(TEXT("浮点:{0},整型:{1},字符串:{2}"),args);

按key

float floatVal = 1.5f;
int intVal = 4;
FString stringVal = TEXT("aaa");
FStringFormatNamedArguments nameArgs;
nameArgs.Add(TEXT("name1"), floatVal);
nameArgs.Add(TEXT("name2"), intVal);
nameArgs.Add(TEXT("name3"), *stringVal);
FString newString = FString::Format(TEXT("浮点:{name1},字符串:{name3},整型:{name2}"),nameArgs);

9、 截取

1.赋值

从左边开始截取

FString stringVal1 = FString(TEXT("abcdefg"));
FString stringVal2 = stringVal1.Left(4); //abcd

从左边排除后面截取

FString stringVal1 = FString(TEXT("abcdefg"));
FString stringVal2 = stringVal1.LeftChop(4);//abc

从右边截取

FString stringVal1 = FString(TEXT("abcdefg"));
FString stringVal2 = stringVal1.Right(4);//defg

从右边排除前面截取

FString stringVal1 = FString(TEXT("abcdefg"));
FString stringVal2 = stringVal1.RightChop(4);//efg

从中间指定位置截取

FString stringVal1 = FString(TEXT("abcdefg"));
FString stringVal2 = stringVal1.Mid(3,2);//de

2.改变自身

FString stringVal1 = FString(TEXT("abcdefg"));
stringVal1.LeftInline(4);
//stringVal1.LeftChopInline(4);
//stringVal1.RightInline(4);
//stringVal1.RightChopInline(4);
//stringVal1.MidInline(4,2);

10、 删除

从前面删除指定

FString stringVal1 = FString(TEXT("abcdefg"));
bool isSuccess = stringVal1.RemoveFromStart(TEXT("abc"));//defg

从后面删除指定

FString stringVal1 = FString(TEXT("abcdefg"));
bool isSuccess = stringVal1.RemoveFromEnd(TEXT("efg"));//abcd

删除指定长度

FString stringVal1 = FString(TEXT("abcdefg"));
stringVal1.RemoveAt(2,3);//abfg

11、 分割

FString stringVal1 = FString(TEXT("a,b,c,d,e,f,g"));
TArray<FString> stringArr;
stringVal1.ParseIntoArray(stringArr, TEXT(","), false);
for (int i = 0; i < stringArr.Num();i++)
{UE_LOG(LogTemp, Display, TEXT("%s"), *stringArr[i]);
}

12、 插入

FString stringVal1 = FString(TEXT("abcdefg"));
FString stringVal2 = FString(TEXT("123"));
stringVal1.InsertAt(2, *stringVal2);//ab123cdefg

13、 替换

1.赋值

FString stringVal1 = FString(TEXT("abacadaeaf"));
FString stringVal2 = stringVal1.Replace(TEXT("a"), TEXT("1"));//1b1c1d1e1f

2.改变自身

FString stringVal1 = FString(TEXT("abacadaeaf"));
stringVal1.ReplaceInline(TEXT("a"), TEXT("1"));

14、 大小写转换

1. 赋值

转大写

FString stringVal1 = FString(TEXT("abcde"));
FString stringVal2 = stringVal1.ToUpper();//ABCDE

转小写

FString stringVal1 = FString(TEXT("ABCDE"));
FString stringVal2 = stringVal1.ToLower();//abcde

2. 改变自身

转大写

FString stringVal1 = FString(TEXT("abcde"));
stringVal1.ToUpperInline();

转小写

FString stringVal1 = FString(TEXT("ABCDE"));
stringVal1.ToLowerInline();

15、 各种格式和FString转换

  这里我写了一个工具类,里面包含各种转换方法:

MyStringTool.h

#pragma once#include "CoreMinimal.h"/*** */
class UECPPTEST_API MyStringTool
{
public:MyStringTool();~MyStringTool();/// <summary>/// 布尔转FString/// </summary>/// <param name="val">布尔值</param>/// <returns></returns>static FString BoolToFString(bool val);/// <summary>/// FString转布尔/// </summary>/// <param name="str"></param>/// <returns></returns>static bool FStringToBool(FString str);/// <summary>/// 整型转FString/// </summary>/// <param name="val">整型值</param>/// <returns></returns>static FString IntToFString(int val);/// <summary>/// FString转int32,转换失败时返回0/// </summary>/// <param name="str">FString</param>/// <returns></returns>static int32 FStringToInt32(FString str);/// <summary>/// FString转int64,转换失败时返回0/// </summary>/// <param name="str">FString</param>/// <returns></returns>static int64 FStringToInt64(FString str);/// <summary>/// Double转FString,指定小数长度,如果本身小数位大于指定长度,会保留原小数位/// </summary>/// <param name="val">double值</param>/// <param name="len">长度</param>/// <returns></returns>static FString DoubleToFString(double val, int len);/// <summary>/// Double转FString/// </summary>/// <param name="val">double值</param>/// <returns></returns>static FString DoubleToFString(double val);/// <summary>/// FString转浮点,转换失败时返回0/// </summary>/// <param name="val">FString</param>/// <returns></returns>static float FStringToFloat(FString val);/// <summary>/// FString转double,转换失败时返回0/// </summary>/// <param name="val">FString</param>/// <returns></returns>static double FStringToDouble(FString val);/// <summary>/// FString转std::string/// </summary>/// <param name="val">FString</param>/// <returns></returns>static std::string FStringToSTDString(FString val);/// <summary>/// std::string转FString/// </summary>/// <param name="val">std::string</param>/// <returns></returns>static FString STDStringToFString(std::string val);
};

MyStringTool.cpp

#include "MyStringTool.h"
#include "string"MyStringTool::MyStringTool()
{
}MyStringTool::~MyStringTool()
{
}
/// <summary>
/// 布尔转FString
/// </summary>
/// <param name="val">布尔值</param>
/// <returns></returns>
FString MyStringTool::BoolToFString(bool val)
{return val ? TEXT("true") : TEXT("false");
}
/// <summary>
/// FString转布尔
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
bool MyStringTool::FStringToBool(FString str)
{return str.ToBool();
}
/// <summary>
/// int32转FString
/// </summary>
/// <param name="val">int32数值</param>
/// <returns></returns>
FString MyStringTool::IntToFString(int32 val)
{return FString::FromInt(val);
}
/// <summary>
/// int64转FString
/// </summary>
/// <param name="val">int64数值</param>
/// <returns></returns>
FString MyStringTool::Int64ToFString(int64 val)
{return FString::Printf(TEXT("%lld"), val);
}/// <summary>
/// FString转int32,转换失败时返回0
/// </summary>
/// <param name="str">FString</param>
/// <returns></returns>
int32 MyStringTool::FStringToInt32(FString str)
{return FCString::Atoi(*str);
}
/// <summary>
/// FString转int64,转换失败时返回0
/// </summary>
/// <param name="str">FString</param>
/// <returns></returns>
int64 MyStringTool::FStringToInt64(FString str)
{return FCString::Atoi64(*str);
}/// <summary>
/// Double转FString,指定小数长度,如果本身小数位大于指定长度,会保留原小数位
/// </summary>
/// <param name="val">double值</param>
/// <param name="len">长度</param>
/// <returns></returns>
FString MyStringTool::DoubleToFString(double val,int len)
{return FString::SanitizeFloat(val,len);
}
/// <summary>
/// Double转FString
/// </summary>
/// <param name="val">double值</param>
/// <returns></returns>
FString MyStringTool::DoubleToFString(double val)
{return FString::SanitizeFloat(val);
}/// <summary>
/// FString转浮点,转换失败时返回0
/// </summary>
/// <param name="val">FString</param>
/// <returns></returns>
float MyStringTool::FStringToFloat(FString val)
{return FCString::Atof(*val);
}/// <summary>
/// FString转double,转换失败时返回0
/// </summary>
/// <param name="val">FString</param>
/// <returns></returns>
double MyStringTool::FStringToDouble(FString val)
{return FCString::Atod(*val);
}/// <summary>
/// FString转std::string
/// </summary>
/// <param name="val">FString</param>
/// <returns></returns>
std::string MyStringTool::FStringToSTDString(FString val)
{return TCHAR_TO_UTF8(*val);
}/// <summary>
/// std::string转FString
/// </summary>
/// <param name="val">std::string</param>
/// <returns></returns>
FString MyStringTool::STDStringToFString(std::string val)
{return FString(val.c_str());
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/12063.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Outlook的IMAP服务器怎么填写?填写步骤?

Outlook的IMAP服务器如何使用&#xff1f;服务器地址怎么查找&#xff1f; 当我们在Outlook中设置新的电子邮件账户时&#xff0c;经常会遇到一个问题&#xff1a;Outlook的IMAP服务器怎么填写呢&#xff1f;接下来&#xff0c;AokSend将详细解答这个问题&#xff0c;并帮助大…

Dive into Deep Learning-优化算法(2)

梯度下降 为什么梯度下降可以优化目标函数&#xff1a;以一维梯度下降为例 f : R → R f:\mathbb{R}\rightarrow\mathbb{R} f:R→R&#xff0c;利用泰勒展开&#xff0c;可以得到&#xff1a; f ( x ϵ ) f ( x ) ϵ f ′ ( x ) O ( ϵ 2 ) f(x \epsilon) f(x) \epsilo…

400元已到账,成交从认真开始

昨天发了一个值班的需求&#xff0c;收到了很多好友的响应&#xff0c;这里非常感谢关注创业程序员卡酷的老朋友、新朋友。今天分享一下&#xff1a;拓展、合作、成交 现在不管是IT行业还是其他行业&#xff0c;大环境可谓一片惨淡&#xff0c;35乃至30找不到工作的失业人员一抓…

深度论证-高速走线控制100欧姆阻抗一定是最好的选择吗?

高速先生成员--黄刚 对于高速差分信号到底需要控制多少欧姆的阻抗&#xff0c;高速先生相信大部分工程师首先都会看下例如信号的协议文档或者芯片的文档&#xff0c;看看里面有没有推荐的控制阻抗值。例如像PCIE信号&#xff0c;在4.0之后的阻抗会明确要求按照85欧姆来控制&…

4.Jmeter阶梯加压Stepping Thread Group

1. 先去Jmeter下载地址下载PluginsManager&#xff0c;放置在Jmeter的lib/ext 目录下 &#xff0c;重启Jmeter 2. 在插件管理器查找并安装jpgc - Standard Set,重启Jmeter 3.右键测试计划->添加->Threads(Users)->jpgc - Stepping Thread Group 然后设置阶梯加压参数…

SAP_ABAP_快速了解_指针

首先abap里有下面几种数据类型 变量&#xff0c;结构和内表 来看下面的比喻&#xff1a; 变量 房间 结构 平房&#xff08;里面有很多房间&#xff1b;是一户人家&#xff09; 内表 楼房&#xff08;有很多层&#xff0c;每层有很多户人家&#xff0c;每户人家又有很多…

贷款没有逾期,征信没问题,为什么大数据信用评分低呢?

大数据信用在金融贷前风控越来越重要&#xff0c;这让不少人开始关心自己的大数据信用了&#xff0c;其中就有不少人有疑问&#xff0c;那就是自己网贷没有逾期&#xff0c;征信记录也还可以&#xff0c;为什么大数据信用评分低呢?这个问题也是不少人都想知道的&#xff0c;小…

鸿蒙开发之跨设备文件访问

分布式文件系统为应用提供了跨设备文件访问的能力&#xff0c;开发者在多个设备安装同一应用时&#xff0c;通过基础文件接口&#xff0c;可跨设备读写其他设备该应用分布式文件路径&#xff08;/data/storage/el2/distributedfiles/&#xff09;下的文件。 例如&#xff1a;多…

Codeforces Round 925 (Div. 3) D. Divisible Pairs(数学)

波利卡普有两个最喜欢的整数 x 和 y (它们可以相等)&#xff0c;他找到了一个长度为 n 的数组 a 。 波利卡普认为一对索引 ⟨ i , j ⟩ ( 1 ≤ i < j ≤ n ) ⟨i,j⟩ ( 1≤i<j≤n ) ⟨i,j⟩(1≤i<j≤n)是优美的&#xff0c;如果&#xff1a; a i a j a_ia_j ai​aj…

信息系统安全与对抗-计算机木马、Web网站攻击技术、网络防火墙(期末复习简答题)

目录 七、计算机木马 1、计算机木马与计算机病毒之间存在的相同点和不同点 3、黑客利用远程控制型木马进行网络入侵的六个步骤 十一、Web 网站攻击技术 2、SQL 注入攻击漏洞的探测方法 3、防范 SQL 注入攻击的措施 5、反射型 XSS、存储型 XSS、DOM 型 XSS 的区别 6、判断…

Arthas使用使用方法

一、Arthas简介 可以用来快速定位java程序使用中的问题&#xff0c;查看程序运行过程中的各种信息。 相对于之前jvm命令方式的定位方式&#xff0c;主要有以下特性: 1) 对源程序无侵入性&#xff0c;不需要重启或修改源码 2) 交互式命令行操作方式&#xff0c;方便使用 3)…

软件测试之【软件测试初级工程师技能点全解】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;初级测试工程师技能点&#x1f449;测试理论基…

Shell脚本之数组

数组 数组中可以存放多个值&#xff08;bash 只支持一维数组&#xff09;数组元素的索引从0开始数组在括号内指定数组的值&#xff0c;每个值仅能用空格分割 其中&#xff1a;30为索引0 20为索引1 10为索引2 60为索引3 以此类推&#xff0c;不过注意索引是从0开始的 如果数组中…

vue布局设置——使用 el-drawer 打造个性化 Admin 后台布局设置

在前端开发中&#xff0c;我们常常需要为 admin 后台构建灵活且个性化的布局设置。今天&#xff0c;我要分享的是如何利用 el-drawer 来实现这样一个有趣的功能。 首先&#xff0c;我们来看一下主要的设置参数&#xff1a; 1. theme: 用于定义主题&#xff0c;可以根据需求切换…

【已解决】attributeerror: ‘FreeTypeFont‘ object has no attribute ‘getsize‘

&#x1f60e; 作者介绍&#xff1a;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff0c;视频号&#xff1a;AI-行者Sun &#x1f388; 本文专栏&#xff1a;本文收录于《AI实战中的各种bug…

ctfshow web入门 phpCVE web312web314

web311 web312 IMAP协议&#xff08;因特网消息访问协议&#xff09;它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息&#xff0c;下载邮件等。它运行在TCP/IP协议之上&#xff0c;使用的端口是143&#xff0c;在php中调用的是imap_open函数来实现功能…

学习java

在实验室看见这本书&#xff0c;无聊看了下&#xff0c;写出了第一个java代码 成功下载了eclipse并且汉化。 写了自己的第一个java程序&#xff1a; package ttttt;public class ttttt {public static void main(String[] args) {System.out.println("hello world")…

Unreal自定义字体中,缺少字怎么办,有没有字表?

关键词&#xff1a;自定义字体&#xff0c;字表&#xff0c;编码&#xff0c;UTF-8,4E00-9FFF,4E00-9FA5,字符查重&#xff0c;字符唯一&#xff0c; 问题&#xff1a; 游戏中经常要自定义字体&#xff0c; 自定义字体往往要做离线字库 offline fonts 离线字库 离不开字符表。…

6 使用 AspectJ 的 AOP 配置管理事务

1. 概述 AspectJ 主要是使用 XML 配置顾问方式自动为每个符合切入点表达式的类生成事务代理。创建测试操作步骤如下&#xff1a; 2. 创建测试项目 创建一个名为 aspectj-aop 项目&#xff0c;pom.xml 文件如下&#xff1a; <?xml version"1.0" encoding"…

调味品企业的销量增长秘诀:五丰黎红引领大厨革新之路

随着时代的发展和消费升级&#xff0c;调味品行业的竞争愈发激烈&#xff0c;在此大环境之下&#xff0c;企业需要不断寻找创新的突破点来实现销量的增长。众所周知&#xff0c;调味品行业的销售渠道主要有餐饮、家庭消费和食品加工&#xff0c;按销售额的占比约为6&#xff1a…