MST

星途 面试题库

面试题:Rust字符串切片与索引访问的复杂应用

假设有一个长字符串 `let long_string = String::from("a very long string with some special characters like: #@$%^&*()_+-=[]{}|;':",./<>?");`,要求编写一个函数,该函数接收这个字符串,找到第一个出现的特殊字符(非字母和数字),并返回从字符串开头到该特殊字符(包括该特殊字符)的切片。同时说明在处理这种需求时,Rust字符串的内存管理和安全性是如何体现的。
44.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
fn find_first_special_char(s: &str) -> Option<&str> {
    for (i, c) in s.chars().enumerate() {
        if!c.is_alphanumeric() {
            return Some(&s[..i + 1]);
        }
    }
    None
}

在Rust中,字符串的内存管理和安全性体现在以下方面:

  1. 内存管理:Rust使用所有权系统来管理内存。字符串&str是一个指向UTF - 8编码字节序列的不可变引用,其内存由调用者负责管理。函数接收&str类型参数,并不获取字符串的所有权,所以不会影响调用者对字符串的使用和内存管理。
  2. 安全性:Rust通过静态检查来确保内存安全。在上述代码中,访问字符串切片&s[..i + 1]时,Rust编译器会在编译时检查索引是否越界。如果索引越界,编译将失败,避免了运行时出现未定义行为,如缓冲区溢出等问题。这使得代码在处理字符串时具有很高的安全性。

调用示例:

fn main() {
    let long_string = String::from("a very long string with some special characters like: #@$%^&*()_+-=[]{}|;':\",./<>?");
    if let Some(slice) = find_first_special_char(&long_string) {
        println!("{}", slice);
    }
}