2010-02-10 13 views

Odpowiedz

135

Podstawowym sposobem jest:

printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars"); 

Drugim, często bardziej użyteczne sposobem jest:

printf ("Here are the first %d chars: %.*s\n", 8, 8, "A string that is more than 8 chars"); 

Tutaj określić długość jak int argument printf(), która leczy "*" w formacie jako żądanie uzyskania długości z argumentu.

Można 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 „% 8.8s”notacja, ale znowu pozwala określić minimalną i maksymalną długość w czasie wykonywania - bardziej realistycznie w scenariuszu jak:

printf("Data: %*.*s Other info: %d\n", minlen, maxlen, string, info); 
+2

Do ostatniego przykładu: Co jeśli skopiowany ciąg jest krótszy niż minlen? – truthseeker

+3

Dane wyjściowe będą puste (po lewej stronie, chyba że dodasz '-'), aby uzyskać pełną określoną długość. –

7
printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars"); 

% 8s by określić minimalną szerokość 8 znaków (..... "% 8s."). Chcesz skrócić o 8, więc użyj% .8s.

Jeśli chcesz wydrukować zawsze dokładnie 8 znaków można użyć% 8.8s

2

w C++ jest to łatwe.

std::copy(someStr.c_str(), someStr.c_str()+n, std::ostream_iterator<char>(std::cout, "")); 

EDIT: Jest to również bezpieczniejsze w użyciu to z iteratorów strunowych, więc nie uciekać się do końca. Nie jestem pewien, co dzieje się z printf i stringami, które są zbyt krótkie, ale przypuszczam, że to może być bezpieczniejsze.

+20

ha, tak, to jest "łatwe". C++ zawsze wygląda jak wypadek samochodowy. –

+0

nadal możesz zrobić printf() w C++ :) – StasM

+6

Myślę, że to był sarkazm. 'std :: cout << someStr.substr (0,8);' jest o wiele bardziej oczywiste. – MSalters

7

Korzystanie printf można zrobić

printf("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars"); 

Jeśli używasz C++ można osiągnąć ten sam rezultat używając STL:

using namespace std; // for clarity 
string s("A string that is more than 8 chars"); 
cout << "Here are the first 8 chars: "; 
copy(s.begin(), s.begin() + 8, ostream_iterator<char>(cout)); 
cout << endl; 

Lub mniej efektywnie:

cout << "Here are the first 8 chars: " << 
     string(s.begin(), s.begin() + 8) << endl; 
+0

Uwaga: nie ** nie ** używaj 'ostream_iterator (cout)'! Zamiast tego użyj 'ostreambuf_iterator (cout)'! Różnica w wydajności powinna być raczej duża. –

4

Ponadto, aby określić stałą ilość znaków, można również użyć * co oznacza, że ​​printf zajmuje liczbę znaków z argumentu:

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
     const char hello[] = "Hello world"; 
     printf("message: '%.3s'\n", hello); 
     printf("message: '%.*s'\n", 3, hello); 
     printf("message: '%.*s'\n", 5, hello); 
     return 0; 
} 

Prints:

message: 'Hel' 
message: 'Hel' 
message: 'Hello' 
3

Drukuj pierwsze cztery znaki:

printf("%.4s\n", "A string that is more than 8 chars");

this link Zobacz więcej informacji (sprawdź .precision -section)

0

W C++, robię to w ten sposób:

char *buffer = "My house is nice"; 
string showMsgStr(buffer, buffer + 5); 
std::cout << showMsgStr << std::endl; 

Pamiętaj, to nie jest bezpieczne, ponieważ po przejściu przez drugi argument mogę iść poza rozmiar łańcucha i generuje naruszenie dostępu do pamięci. Aby tego uniknąć, musisz wprowadzić własny czek.

Powiązane problemy