Skip to content

Length and Character Iteration

.len() returns the number of bytes in the string, not the number of Unicode characters. For pure ASCII text the values are the same; accented characters or emoji may occupy more than one byte.

.chars() returns a string array — each element is a character (a string of length 1). Iterate with for to process letter by letter:

.len() for measuring; .chars() for iterating and counting occurrences.

08-len-and-chars.zolo
Playground
// Feature: Length and iteration over characters

// Syntax: `s.len()` -> int, `s.chars()` -> [str]

// When to use: measure length, iterate character by character.


// -- len: byte length ------------------------------------------

print("zolo".len())  // 4

print("".len())  // 0

print("hello world".len())  // 11


// Note: `.len()` returns the length in BYTES, not Unicode code

// points. Accented characters / emoji may take more than one byte.

print("cafe".len())  // 4 (plain ASCII)

print("a".len())  // 1


// -- chars: array of characters (1 string per element) --------

let cs = "abc".chars()
print(cs.len())  // 3

print(cs[0])  // a

print(cs[1])  // b

print(cs[2])  // c


// Iterate character by character.

for c in "zolo".chars() {
  print(c)
}

// expected:

// z

// o

// l

// o


// Count occurrences of a character.

fn count_char(s: str, target: str) -> int {
  var total = 0
  for c in s.chars() {
    if c == target {
      total = total + 1
    }
  }
  return total
}

print(count_char("mississippi", "s"))  // 4

print(count_char("zolo lang", "o"))  // 2


// Check whether a string is "empty".

fn is_empty(s: str) -> bool {
  return s.len() == 0
}

print(is_empty(""))  // true

print(is_empty("x"))  // false

Challenge

Write a function reverse(s: str) -> str that walks .chars() backwards (use a decreasing index) and accumulates the characters with +. Test with "zolo" — the result should be "oloz".

enespt-br