Podstawowy sposób to:
printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");
Drugi, często bardziej przydatny sposób to:
printf ("Here are the first %d chars: %.*s\n", 8, 8, "A string that is more than 8 chars");
Tutaj określasz długość jako argument int funkcji printf (), która traktuje „*” w formacie jako żądanie pobrania długości z argumentu.
Możesz również użyć notacji:
printf ("Here are the first 8 chars: %*.*s\n",
8, 8, "A string that is more than 8 chars");
Jest to również analogiczne do notacji „% 8.8s”, ale ponownie umożliwia określenie minimalnej i maksymalnej długości w czasie wykonywania - bardziej realistycznie w scenariuszu takim jak:
printf("Data: %*.*s Other info: %d\n", minlen, maxlen, string, info);
Specyfikacja POSIX dla printf()
definiuje te mechanizmy.
-
), aby uzyskać pełną określoną długość.% 8s określiłoby minimalną szerokość 8 znaków. Chcesz skrócić o 8, więc użyj% .8s.
Jeśli chcesz zawsze drukować dokładnie 8 znaków, możesz użyć% 8.8s
źródło
Oprócz określenia stałej liczby znaków, możesz również użyć,
*
co oznacza, że printf pobiera liczbę znaków z argumentu:Wydruki:
źródło
Używając
printf
możesz zrobićJeśli używasz C ++, możesz osiągnąć ten sam wynik, używając STL:
Lub mniej wydajnie:
źródło
ostream_iterator<char>(cout)
! Zamiast tego użyjostreambuf_iterator<char>(cout)
! Różnica w wydajności powinna być dość duża.std::cout.write(s.data(), 8)
. Lub w nowoczesnych C ++std::cout << std::string_view{s.data(), 8}
.Wydrukuj pierwsze cztery znaki:
printf("%.4s\n", "A string that is more than 8 chars");
Zobacz ten link, aby uzyskać więcej informacji (sprawdź sekcję .precision)
źródło
W C ++ jest to łatwe.
EDYCJA: Bezpieczniej jest również używać tego z iteratorami ciągów, więc nie uciekniesz do końca. Nie jestem pewien, co się dzieje z printf i stringami, które są zbyt krótkie, ale myślę, że może to być bezpieczniejsze.
źródło
std::cout << someStr.substr(0,8);
jest dużo bardziej oczywiste.printf (..... "%. 8s")
źródło
W C ++ robię to w ten sposób:
Proszę zauważyć, że nie jest to bezpieczne, ponieważ przekazując drugi argument, mogę wyjść poza rozmiar ciągu i wygenerować naruszenie dostępu do pamięci. Aby tego uniknąć, musisz wdrożyć własną kontrolę.
źródło