| 4 UCX provides an API to work with structures that store a [string](string.h.md) together with its length, |
4 UCX provides an API to work with structures that store a [string](string.h.md) together with its length, |
| 5 as well as a more sophisticated [buffer](buffer.h.md) API for working with text of dynamic or unknown length. |
5 as well as a more sophisticated [buffer](buffer.h.md) API for working with text of dynamic or unknown length. |
| 6 |
6 |
| 7 Additionally, UCX offers several advanced [printf-like functions](printf.h.md) that also allow convenient work |
7 Additionally, UCX offers several advanced [printf-like functions](printf.h.md) that also allow convenient work |
| 8 with strings of unknown length. |
8 with strings of unknown length. |
| 9 For example, one the more advanced functions is `cx_sprintf_sa()` which lets you format a string into an existing |
9 For example, one of the more advanced functions is `cx_sprintf_sa()` which lets you format a string into an existing |
| 10 pre-allocated buffer (e.g. on the stack) and automatically switches to a fresh buffer allocated by a custom allocator |
10 pre-allocated buffer (e.g., on the stack) and automatically switches to a fresh buffer allocated by a custom allocator |
| 11 when the existing buffer is not large enough. |
11 when the existing buffer is not large enough. |
| 12 |
12 |
| 13 The string API is designed to work with _both_ mutable and constant strings. |
13 The string API is designed to work with _both_ mutable and constant strings. |
| 14 The possibility to work with constant strings is especially important when you want to work with string literals |
14 The possibility to work with constant strings is especially important when you want to work with string literals |
| 15 without copying them into a separate memory region - e.g., when you want to get a substring. |
15 without copying them into a separate memory region - e.g., when you want to get a substring. |