Bird
Raised Fist0
DSA Rustprogramming~20 mins

How Strings Work Differently Across Languages in DSA Rust - Debugging & Practice

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Rust String Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of this Rust string slicing code?
Consider the following Rust code that slices a string. What will be printed?
DSA Rust
fn main() {
    let s = String::from("hello");
    let slice = &s[0..2];
    println!("{}", slice);
}
A"he"
B"hel"
C"hello"
DRuntime panic
Attempts:
2 left
💡 Hint
Remember Rust string slices use byte indices and must be on valid UTF-8 boundaries.
❓ Predict Output
intermediate
2:00remaining
What happens when slicing a UTF-8 string incorrectly in Rust?
What error or output results from this Rust code?
DSA Rust
fn main() {
    let s = String::from("Здравствуйте");
    let slice = &s[0..1];
    println!("{}", slice);
}
ARuntime panic due to invalid UTF-8 slice
BCompilation error
CPrints an empty string
DPrints the first character "З"
Attempts:
2 left
💡 Hint
UTF-8 characters can be multiple bytes; slicing must respect character boundaries.
🔧 Debug
advanced
2:00remaining
Why does this Rust code fail to compile when concatenating strings?
Identify the error in this Rust code and what causes it.
DSA Rust
fn main() {
    let s1 = String::from("Hello, ");
    let s2 = "world!";
    let s3 = s1 + s2;
    println!("{}", s3);
    println!("{}", s1);
}
ARuntime panic due to invalid string concatenation
BCompilation error because s2 is not a String
CPrints "Hello, world!" and then "Hello, "
DCompilation error because s1 is moved and cannot be used after +
Attempts:
2 left
💡 Hint
The + operator moves the left String operand in Rust.
❓ Predict Output
advanced
2:00remaining
What is the output of this Rust code using String::from_utf8_lossy?
What does this Rust code print?
DSA Rust
fn main() {
    let bytes = vec![240, 159, 146, 150, 255];
    let s = String::from_utf8_lossy(&bytes);
    println!("{}", s);
}
A"�����"
BCompilation error
C"💖�"
DRuntime panic
Attempts:
2 left
💡 Hint
from_utf8_lossy replaces invalid bytes with replacement character �.
🧠 Conceptual
expert
2:00remaining
Why does Rust differentiate between String and &str types?
Choose the best explanation for why Rust has both String and &str types.
A&str owns the data; String is a pointer to &str
BString owns its data and is mutable; &str is a borrowed view and usually immutable
CString is for ASCII only; &str is for UTF-8 strings
DString is a fixed-size array; &str is a dynamic array
Attempts:
2 left
💡 Hint
Think about ownership and mutability in Rust.

Practice

(1/5)
1. In Rust, which of the following best describes how String differs from string types in some other languages like Python or JavaScript?
easy
A. String in Rust is immutable and fixed-length like Python strings.
B. String in Rust is a growable, heap-allocated UTF-8 encoded string.
C. String in Rust stores characters as UTF-16 code units internally.
D. String in Rust is a simple alias for a byte array without encoding.

Solution

  1. Step 1: Understand Rust's String type

    Rust's String is designed to be growable and stored on the heap, unlike fixed-length strings in some languages.
  2. Step 2: Compare with other languages

    Languages like Python have immutable strings, and JavaScript strings are UTF-16 encoded internally, but Rust uses UTF-8 encoding for String.
  3. Final Answer:

    String in Rust is a growable, heap-allocated UTF-8 encoded string. -> Option B
  4. Quick Check:

    Rust String = growable UTF-8 heap string [OK]
Hint: Remember Rust strings are UTF-8 and growable, unlike fixed immutable strings [OK]
Common Mistakes:
  • Thinking Rust strings are immutable like Python strings
  • Assuming Rust strings use UTF-16 encoding
  • Confusing String with byte arrays without encoding
2. Which of the following is the correct way to create a mutable String in Rust?
easy
A. let mut s = String::from("hello");
B. let s = "hello";
C. let s = String::new("hello");
D. let s = "hello".to_string();

Solution

  1. Step 1: Identify mutable string creation syntax

    In Rust, to create a mutable String, you declare it with mut and use String::from or to_string().
  2. Step 2: Check each option

    let s = "hello"; creates an immutable string slice (&str), not a String. let mut s = String::from("hello"); correctly creates a mutable String. let s = String::new("hello"); is invalid syntax. let s = "hello".to_string(); creates a String but lacks mut, making the binding immutable.
  3. Final Answer:

    let mut s = String::from("hello"); -> Option A
  4. Quick Check:

    Mutable String = let mut s = String::from(...) [OK]
Hint: Use let mut s = String::from(...) for mutable strings [OK]
Common Mistakes:
  • Using string literals without mut for mutability
  • Trying to use String::new("hello") which is invalid
  • Confusing string slices with String type
3. What will be the output of the following Rust code?
let s = String::from("hello");
let h = &s[0..1];
println!("{}", h);
medium
A. Runtime panic due to invalid UTF-8 slicing
B. he
C. h
D. hello

Solution

  1. Step 1: Understand Rust string slicing rules

    Rust strings are UTF-8 encoded, so slicing must be on valid UTF-8 boundaries. Index 0..1 slices the first byte only.
  2. Step 2: Check if slicing 0..1 is valid UTF-8

    For "hello", ASCII characters are 1 byte each, so 0..1 is valid and equals "h".
  3. Step 3: Confirm output

    println!("{}", h) where h = &s[0..1] = "h" outputs h.
  4. Final Answer:

    h -> Option C
  5. Quick Check:

    Slice 0..1 of "hello" = "h" [OK]
Hint: Remember ASCII chars are 1 byte, so 0..1 slice is valid [OK]
Common Mistakes:
  • Assuming slicing 0..1 causes panic always
  • Confusing byte index with character index
  • Expecting multiple characters from 0..1 slice
4. Identify the error in this Rust code snippet:
let s = String::from("Здравствуйте");
let slice = &s[0..1];
println!("{}", slice);
medium
A. No error, prints first character
B. Prints garbage characters
C. Compile-time error: invalid slice syntax
D. Runtime panic: slicing not on UTF-8 boundary

Solution

  1. Step 1: Analyze the string content and slicing

    The string "Здравствуйте" contains Cyrillic characters, each encoded in multiple bytes in UTF-8.
  2. Step 2: Check slicing 0..1 validity

    Slicing 0..1 takes only the first byte, which is not a valid UTF-8 character boundary for Cyrillic letters, causing a runtime panic.
  3. Final Answer:

    Runtime panic: slicing not on UTF-8 boundary -> Option D
  4. Quick Check:

    UTF-8 multi-byte chars require valid slice boundaries [OK]
Hint: Multi-byte UTF-8 chars cannot be sliced by single bytes [OK]
Common Mistakes:
  • Assuming slicing always works like ASCII
  • Ignoring UTF-8 multi-byte character boundaries
  • Expecting compile-time error instead of runtime panic
5. Given a Rust String containing Unicode text, which approach correctly iterates over each Unicode character safely?
hard
A. Using for c in s.chars() to iterate over Unicode scalar values.
B. Using for i in 0..s.len() and slicing &s[i..i+1] for each byte.
C. Using for c in s.bytes() to get each character.
D. Using for c in s.split(' ') to get characters.

Solution

  1. Step 1: Understand Rust string iteration methods

    s.chars() iterates over Unicode scalar values (characters) safely, respecting UTF-8 boundaries.
  2. Step 2: Evaluate other options

    Using for i in 0..s.len() and slicing &s[i..i+1] slices bytes which can cause invalid UTF-8. for c in s.bytes() iterates bytes, not characters. for c in s.split(' ') splits by spaces, not characters.
  3. Final Answer:

    Using for c in s.chars() to iterate over Unicode scalar values. -> Option A
  4. Quick Check:

    Use s.chars() for safe Unicode iteration [OK]
Hint: Use s.chars() to safely iterate Unicode characters [OK]
Common Mistakes:
  • Iterating bytes instead of characters
  • Slicing string by byte indices unsafely
  • Using split which divides by delimiter, not characters
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard