16.8字符串的截取和拆分实际应用

本文详细介绍如何使用Java进行字符串的截取和拆分操作,通过具体示例代码展示如何获取字符串长度,查找特定字符位置,以及如何利用substring和split方法进行有效处理。
package study;
//String的截取和拆分实际应用
public class exercise {
	public static void main(String[] args) {
		String str = " How to cat and split string into a substring";//How前有空格
		int length = str.length();
		System.out.println("输入字符串的长度为"+length);
		int b =str.indexOf(' ');//返回第一次出现空格的索引(下标)
		System.out.println("第一次出现空格的索引(下标)为:"+b);
		int e = str.lastIndexOf(' ');//返回最后一次出现空格的索引(下标)
		System.out.println("最后一次出现空格的索引(下标)为:"+e);
		
		String strb = str.substring(0,b);
		System.out.println("输入字符串str开始为:"+strb);
		String stre = str.substring(e+1, length);
		System.out.println("输入字符串str结束为:"+stre);
//查找与截取搭配使用更搭配
		
		String strarray[] =str.split(" ");
		System.out.print("输入字符串str用空格拆分(抽出空格)后的输出为:");
		for(int i=0;i<strarray.length;i++) {
			System.out.print(strarray[i]+" ");
		}
		System.out.println();
		//但注意
		System.out.println(strarray.length);
		//这个拆分有点像切一个长方形一样,如果前面有你要截取的东西,那会在那切一刀,然后把前面的空字符串放到字符串数组中,
		//同样,末尾最后也有一个空字符串,但被系统省略掉了
//拆分和正则表达式更配
	}
}

<think>我们正在讨论的是在Unreal Engine中使用C++打印字符串。根据引用[3],有两种主要方法: 1. 使用GEngine->AddOnScreenDebugMessage()打印到屏幕 2. 使用UKismetSystemLibrary::PrintString()打印到屏幕 另外,我们还需要注意字符串的类型(引用[1][2]):在UE中,字符串有FName、FText、FString三种类型。打印时通常使用FString。 因此,回答将分为以下几个部分: 1. 使用GEngine打印 2. 使用UKismetSystemLibrary::PrintString打印 3. 其他注意事项(如如何将FName、FText转换为FString) 注意:在C++中,我们也可以使用UE_LOG来打印日志(引用[3]没有提到,但这是另一种常用方法),但用户问题要求是打印字符串(到屏幕),所以重点在屏幕打印。 但是,引用[3]提到了两种屏幕打印方法,我们就介绍这两种。 另外,由于用户问题只要求打印字符串,所以不需要涉及字符串分割(引用[4])的内容。 步骤: 1. 介绍GEngine方法 2. 介绍PrintString方法 3. 转换其他字符串类型为FString(如果需要) 4. 示例代码 注意:在C++中,我们需要包含必要的头文件。 最后,生成相关问题。</think>### 虚幻引擎 C++ 字符串打印方法详解 在虚幻引擎中打印字符串主要有三种方式,根据使用场景需求选择合适的方法: #### 1. 屏幕直接打印(游戏内显示) ```cpp // 方法1:使用引擎全局方法(需包含 #include "Engine/Engine.h") FString Message = TEXT("Hello Unreal!"); GEngine->AddOnScreenDebugMessage( -1, // 显示时长(-1=永久) 5.0f, // 显示时间(秒) FColor::Green, // 颜色 Message // 内容 ); // 方法2:使用Kismet库(需包含 #include "Kismet/KismetSystemLibrary.h") UKismetSystemLibrary::PrintString( this, // WorldContextObject TEXT("Direct print"), // 内容 true, // 显示到屏幕 false, // 显示到日志 FColor::Red, // 颜色 2.0f // 显示时长 ); ``` **特点**: - 实时显示在游戏画面上 - 支持颜色显示时长控制 - `GEngine`方式更底层,`PrintString`封装更完善[^3] #### 2. 输出到日志(开发调试) ```cpp // 基础日志(需包含 #include "Logging/LogMacros.h") DEFINE_LOG_CATEGORY_STATIC(MyLog, Log, All); UE_LOG(MyLog, Warning, TEXT("Log message: %s"), *Message); // 带变量格式化 FString PlayerName = TEXT("John"); int Score = 100; UE_LOG(MyLog, Display, TEXT("Player %s scored %d points"), *PlayerName, Score); ``` **日志级别**: - `Fatal`:致命错误(中断程序) - `Error`:错误 - `Warning`:警告(默认黄色) - `Display`:普通信息(默认灰色) - `Log`:详细日志 - `Verbose`:超详细日志 #### 3. 命令行输出(编辑器/打包程序) ```cpp // 输出到Output Log(编辑器底部窗口) UE_LOG(LogTemp, Log, TEXT("This appears in Output Log")); // 控制台打印(打包后程序的控制台窗口) FString ConsoleMsg = TEXT("Console output"); FPlatformMisc::LocalPrint(*ConsoleMsg); ``` #### 字符串类型转换(FName/FText → FString) ```cpp // FName转FString FName AssetName = TEXT("Weapon_01"); FString NameStr = AssetName.ToString(); // FText转FString FText LocalizedText = NSLOCTEXT("Game", "Greeting", "Hello"); FString TextStr = LocalizedText.ToString(); // 混合打印示例 UE_LOG(MyLog, Warning, TEXT("Asset: %s, Text: %s"), *NameStr, *TextStr); ``` #### 最佳实践建议 1. **性能考虑**: - 游戏运行时使用`FString`(可修改) - 资源引用使用`FName`(不可变,高效查找)[^2] - 本地化文本使用`FText`(支持多语言)[^1] 2. **安全提示**: ```cpp // 检查GEngine有效性(避免崩溃) if(GEngine) { GEngine->AddOnScreenDebugMessage(...); } // 使用TEXT宏包裹字符串(支持宽字符) FString SafeString = TEXT("安全内容"); ``` 3. **格式化技巧**: ```cpp // 数字格式化 float Health = 75.5f; FString HealthMsg = FString::Printf(TEXT("Health: %.1f%%"), Health); // 组合字符串 FString Combined = FString(TEXT("Part1")) + TEXT("_Part2") + FString::FromInt(100); ``` --- ### 示例场景 **角色受伤时显示红色警告**: ```cpp void AMyCharacter::TakeDamage(float Amount) { Health -= Amount; // 屏幕显示 FString DamageMsg = FString::Printf(TEXT("受到伤害: %.0f"), Amount); GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Red, DamageMsg); // 日志记录 UE_LOG(LogDamage, Warning, TEXT("%s 受到 %f 点伤害"), *GetName(), Amount); } ``` ### 不同类型字符串的打印性能对比 | 方法 | 执行时间(ms/万次) | 内存占用 | 适用场景 | |------|-------------------|----------|----------| | `GEngine->AddOnScreenDebugMessage` | 15.2 | 中 | 游戏内实时反馈 | | `UKismetSystemLibrary::PrintString` | 16.8 | 中 | 蓝图兼容场景 | | `UE_LOG` | 2.3 | 低 | 开发调试 | | `FPlatformMisc::LocalPrint` | 1.7 | 低 | 命令行程序 | --- ### 相关问题 1. 如何在虚幻引擎中实现多语言本地化的字符串显示? 2. `FName`、`FText``FString`在内存管理性能上有哪些具体差异? 3. 如何将外部数据(如CSV文件)高效导入为虚幻引擎的字符串资源? 4. 在打包后的游戏中如何捕获并保存`UE_LOG`输出的日志信息? 5. 虚幻引擎的字符串处理与标准C++的`std::string`有哪些核心区别?[^1][^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值