W języku C łańcuchy reprezentuje się jako tablice znaków, a operacje na nich wykonuje z użyciem wskaźników. Rozmiar takiej tablicy może być dowolny, nie jest oddzielnie przechowywany, a programista musi zadbać o to, by napis nie przekroczył rozmiaru bufora (przepełnienie bufora), a także, by pamięć po buforze była zwolniona. Napis nie musi wypełniać całej tablicy, ponieważ znacznikiem końca napisu jest znak o kodzie zero ('\0'). Taką reprezentację nazywa się z ang. null terminated string.

W C++ oprócz tradycyjnych tablic znaków w stylu C, istnieje w bibliotece standardowej klasa std::string. Ukrywa ona niewygodne aspekty używania napisów w stylu C: zarządzanie pamięcią, określanie długości, łączenie napisów, wstawianie, usuwanie i inne manipulacje na napisie. Dodatkowo pozbyto się problemu znaku kończącego – znak o kodzie 0 może być elementem napisu std::string (długość przechowywana jest oddzielnie). Ponieważ biblioteka standardowa (bazująca w tym zakresie na STL) została dość późno dołączona do oficjalnego standardu, wiele kompilatorów dostarcza własne implementacje typów napisowych – np. String, AnsiString, CString. Również niektóre starsze biblioteki (jak np. Qt) dostarczają własnych typów obsługi napisów.