If you are working with strings you have two basic ways to define its length. Either you write a specific symbol at its end or you save/provide its length seperatly.
Null-terminated strings
All old school functions who operate with strings will do that on C-strings (char array) and nearly all of them will be null-terminated.
Not null-terminated strings
Many modern functions will operate on C++-Strings (std::string) instead, which contains of a not null-terminated string and its length.
Showcase: printf with not null-terminated strings
#include <stdio.h> #include <memory.h> int main() { char buf1[3]; memcpy(buf1, "aaa", sizeof(buf1)); char buf2[3]; memcpy(buf2, "bbb", sizeof(buf2)); char buf3[3]; memcpy(buf3, "ccc", sizeof(buf3)); // it will write to stdout till it reaches a '\0' (0x00) printf("%s\n", buf1); // but it can also work with not null-terminated strings printf("%.*s\n", static_cast<int>(sizeof(buf1)), buf1); return 0; }
$ g++ main.cpp -g $ gdb a.out (gdb) b 18 (gdb) r aaabbbccc aaa (gdb) x/10x &buf1 0x7fffffffdcbf: 0x61 0x61 0x61 0x62 0x62 0x62 0x63 0x63 0x7fffffffdcc7: 0x63 0x00