Gibt es eine Möglichkeit anzugeben, wie viele Zeichen einer Zeichenfolge mit printf () ausgedruckt werden sollen?

127

Gibt es eine Möglichkeit anzugeben, wie viele Zeichen einer Zeichenfolge ausgedruckt werden sollen (ähnlich wie Dezimalstellen in ints)?

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

Möchte es drucken: Here are the first 8 chars: A string

TTT
quelle

Antworten:

226

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.

Jonathan Leffler
quelle
2
Zum letzten Beispiel: Was ist, wenn die kopierte Zeichenfolge kürzer als minlen ist?
Wahrheitssucher
4
Die Ausgabe wird leer aufgefüllt (links, sofern Sie kein a hinzufügen -), um die angegebene Länge zu erreichen.
Jonathan Leffler
13
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

Entwicklungswahnsinn
quelle
13

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'
hlovdal
quelle
11

Mit können printfSie 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;
Peter Alexander
quelle
1
Hinweis: nicht verwenden ostream_iterator<char>(cout)! Verwenden ostreambuf_iterator<char>(cout)Sie stattdessen ! Der Leistungsunterschied sollte ziemlich groß sein.
Dietmar Kühl
Viel effizienter zu verwenden : std::cout.write(s.data(), 8). Oder in modernem C ++ , std::cout << std::string_view{s.data(), 8}.
Artyer
4

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).

Anssi
quelle
4

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.

Chris H.
quelle
32
ha, ja das ist "einfach". C ++ sieht immer wie ein Autounfall aus.
Präsident James K. Polk
Sie können immer noch printf () in c ++ machen :)
StasM
6
Ich denke das war Sarkasmus. std::cout << someStr.substr(0,8);ist viel offensichtlicher.
MSalters
2
@ MSalters Das solltest du als Antwort posten.
Jonathan Mee
3

printf (..... "%. 8s")

pm100
quelle
1

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.

Rodolk
quelle