wake-up-neo.net

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

Gibt es eine Möglichkeit, anzugeben, wie viele Zeichen einer Zeichenfolge ausgegeben 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

90
T.T.T.

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 ein int-Argument für printf () an, das das '*' im Format als Anforderung behandelt, um die Länge eines Arguments abzurufen.

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 zu der "% 8.8s" -Notation, erlaubt jedoch wiederum die Angabe der minimalen und maximalen Länge zur Laufzeit - 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.

178
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 um 8 abschneiden, verwenden Sie also% .8s.

Wenn Sie immer genau 8 Zeichen drucken möchten, können Sie% 8.8s verwenden

10

Mit printf können Sie das 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 das gleiche 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;
9
Peter Alexander

Neben der Angabe einer festen Anzahl von Zeichen können Sie auch * verwenden. Dies bedeutet, dass printf die Anzahl der Zeichen aus einem Argument entnimmt:

#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'
7
hlovdal

Gib die ersten vier Zeichen aus:

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

Siehe dieser Link für weitere Informationen (siehe .precision -section)

4
Anssi

In C++ ist das einfach. 

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

EDIT: Es ist auch sicherer, dies mit String-Iteratoren zu verwenden, damit Sie nicht am Ende laufen. Ich bin mir nicht sicher, was mit printf und string zu kurz passiert, aber ich denke, das ist sicherer. 

3
Chris H

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

2
pm100

In C++ mache ich das so:

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 die Größe des Strings überschreiten und eine Speicherzugriffsverletzung generieren kann. Sie müssen eine eigene Prüfung implementieren, um dies zu vermeiden.

0
rodolk