Angenommen, ich habe folgendes:
char* string = "Hello, how are you?";
Kann man nur die letzten 5 Bytes dieser Zeichenkette ausdrucken? Was ist mit den ersten 5 Bytes? Gibt es eine Variation von printf
, die dies zulässt?
Kann man nur die letzten 5 Bytes dieser Zeichenkette ausdrucken?
Ja, übergeben Sie einfach einen Zeiger auf das vorletzte Zeichen. Sie können dies durch string + strlen(string) - 5
bestimmen.
Was ist mit den ersten 5 Bytes?
Verwenden Sie einen Präzisionsspezifizierer: %.5s
#include <stdio.h>
#include <string.h>
char* string = "Hello, how are you?";
int main() {
/* print at most the first five characters (safe to use on short strings) */
printf("(%.5s)\n", string);
/* print last five characters (dangerous on short strings) */
printf("(%s)\n", string + strlen(string) - 5);
int n = 3;
/* print at most first three characters (safe) */
printf("(%.*s)\n", n, string);
/* print last three characters (dangerous on short strings) */
printf("(%s)\n", string + strlen(string) - n);
return 0;
}
Ja, die letzten fünf Bytes dieser Zeichenfolge können mit folgendem Befehl erstellt werden:
printf ("%s\n", &(string[strlen (string) - 5]));
Die ersten fünf können gemacht werden mit:
printf ("%.5s\n", string);
Sie können beide kombinieren, um auch Teilzeichenfolgen innerhalb der Zeichenfolge zu erhalten. Das Wort how
kann gedruckt werden mit:
printf ("%.3s\n", &(string[strlen (string) + 7]));
Sie müssen darauf achten, dass die Zeichenfolge lang genug ist, damit dies funktioniert. Das Drucken der letzten fünf Zeichen einer Zeichenfolge mit einem Zeichen führt zu undefiniertem Verhalten, da der Index bei -4
endet. Mit anderen Worten, überprüfen Sie die Länge der Zeichenfolge, bevor Sie dies versuchen.
Zwei Lösungen:
Angenommen, eine vorhersagbare Zeichenfolge mit derselben Länge - ich werde date als Beispiel verwenden und gebeten, sie in HH: MM: SS.DDDDDDD zu teilen
char date[14] = "2359591234567";
[1] Lesbare Implementierung:
char hh[3] = {0};
char mm[3] = {0};
char ss[3] = {0};
char dec[8] = {0};
strncpy ( hh, date, 2 );
strncpy ( mm, date+2, 2 );
strncpy ( ss, date+4, 2 );
strncpy ( dec, date+6, 7 );
printf("%s:%s:%s.%s\n", hh, mm, ss, dec);
[2] Kurze Implementierung:
Entweder:
printf("%.2s:%.2s:%.2s.%.7s\n", date, date+2, date+4, date+6);
oder:
printf("%2.2s:%2.2s:%2.2s.%7.7s\n", date, date+2, date+4, date+6);
Sollte arbeiten.
Anstelle von printf können Sie sprintf verwenden und in einen Puffer kopieren. Ich würde auch nach der korrekten Länge suchen, um unvorhersehbares Verhalten zu vermeiden.
In beiden Fällen lautet die Ausgabe:
23:59:59.1234567