Antworten:
Der grundlegende Weg ist:
printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");
Der andere, oft nützlichere Weg ist:
printf ("Here are the first %d chars: %.*s\n", 8, 8, "A string that is more than 8 chars");
Hier geben Sie die Länge als int-Argument für printf () an, das das '*' im Format als Anforderung zum Abrufen der Länge aus einem Argument behandelt.
Sie können auch die Notation verwenden:
printf ("Here are the first 8 chars: %*.*s\n",
8, 8, "A string that is more than 8 chars");
Dies ist auch analog zur Notation "% 8.8s", ermöglicht es Ihnen jedoch erneut, die minimale und maximale Länge zur Laufzeit anzugeben - realistischer in einem Szenario wie:
printf("Data: %*.*s Other info: %d\n", minlen, maxlen, string, info);
Die POSIX-Spezifikation für printf()
definiert diese Mechanismen.
-
), um die angegebene Länge zu erreichen.
printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");
% 8s würde eine Mindestbreite von 8 Zeichen angeben. Sie möchten bei 8 abschneiden, verwenden Sie also% .8s.
Wenn Sie immer genau 8 Zeichen drucken möchten, können Sie% 8.8s verwenden
Sie können nicht nur eine feste Anzahl von Zeichen angeben *
, sondern auch verwenden, was bedeutet, dass printf die Anzahl der Zeichen aus einem Argument übernimmt:
#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;
}
Drucke:
message: 'Hel'
message: 'Hel'
message: 'Hello'
Mit können printf
Sie tun
printf("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");
Wenn Sie C ++ verwenden, können Sie mit der STL dasselbe Ergebnis erzielen:
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;
Oder weniger effizient:
cout << "Here are the first 8 chars: " <<
string(s.begin(), s.begin() + 8) << endl;
ostream_iterator<char>(cout)
! Verwenden ostreambuf_iterator<char>(cout)
Sie stattdessen ! Der Leistungsunterschied sollte ziemlich groß sein.
std::cout.write(s.data(), 8)
. Oder in modernem C ++ , std::cout << std::string_view{s.data(), 8}
.
Drucken Sie die ersten vier Zeichen:
printf("%.4s\n", "A string that is more than 8 chars");
Weitere Informationen finden Sie unter diesem Link ( siehe .Precision-Abschnitt).
In C ++ ist es einfach.
std::copy(someStr.c_str(), someStr.c_str()+n, std::ostream_iterator<char>(std::cout, ""));
BEARBEITEN: Es ist auch sicherer, dies mit String-Iteratoren zu verwenden, damit Sie nicht am Ende davonlaufen. Ich bin mir nicht sicher, was mit zu kurzen printf und string passiert, aber ich denke, das ist sicherer.
std::cout << someStr.substr(0,8);
ist viel offensichtlicher.
In C ++ mache ich das folgendermaßen:
char *buffer = "My house is nice";
string showMsgStr(buffer, buffer + 5);
std::cout << showMsgStr << std::endl;
Bitte beachten Sie, dass dies nicht sicher ist, da ich beim Übergeben des zweiten Arguments über die Größe der Zeichenfolge hinausgehen und eine Speicherzugriffsverletzung generieren kann. Sie müssen Ihre eigene Prüfung durchführen, um dies zu vermeiden.