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

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.


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


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'

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;

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


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.


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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.