Ist es möglich, nur einen bestimmten Abschnitt eines C-Strings auszudrucken, ohne einen separaten Teilstring zu erstellen?

Lesezeit: 3 Minuten

Benutzeravatar von Tim
Tim

Angenommen ich habe folgendes:

char* string = "Hello, how are you?";

Ist es möglich, nur die letzten 5 Bytes dieser Zeichenfolge auszudrucken? Was ist nur mit den ersten 5 Bytes? Gibt es eine Variation von printf das würde das zulassen?

Benutzeravatar von Robᵩ
Robᵩ

Ist es möglich, nur die letzten 5 Bytes dieser Zeichenfolge auszudrucken?

Ja, übergeben Sie einfach einen Zeiger auf das fünftletzte Zeichen. Sie können dies durch bestimmen string + strlen(string) - 5.

Was ist nur mit den ersten 5 Bytes?

Verwenden Sie einen Genauigkeitsbezeichner: %.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;
}

  • @Tim – Gern geschehen. Vergessen Sie nicht, alle nützlichen Antworten hochzustimmen, und akzeptieren Sie die Antwort, die Ihr Problem gelöst hat. (Ps Beachten Sie den Rat im anderen Beitrag – wenn Ihre Zeichenfolge zu kurz ist, schlägt dieser Code fehl.)

    – Robᵩ

    15. Oktober 2011 um 21:51 Uhr


  • Das Beispielprogramm wurde aktualisiert, um die Kommentare von @Tim in einer anderen Antwort zu behandeln.

    – Robᵩ

    15. Oktober 2011 um 22:38 Uhr

  • Beachten Sie, dass printf wird immer noch beim ersten Nullzeichen anhalten.

    – Flimmer

    29. April 2014 um 16:59 Uhr

  • Erstaunliche Antwort. Ich wusste, dass man viel tun könnte, aber das hat mich trotzdem überrascht. Vielen Dank.

    – Anton Krug

    7. Februar 2018 um 14:42 Uhr

Benutzeravatar von paxdiablo
paxdiablo

Ja, die letzten fünf Bytes dieser Zeichenfolge können folgendermaßen ausgeführt werden:

printf ("%s\n", &(string[strlen (string) - 5]));

Die ersten fünf können durchgeführt werden mit:

printf ("%.5s\n", string);

Sie können die beiden kombinieren, um auch Teilstrings innerhalb des Strings zu erhalten. Das Wort how bedruckbar mit:

printf ("%.3s\n", &(string[strlen (string) + 7]));

Du tun muss darauf geachtet werden, dass die Saite 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 endet -4. Mit anderen Worten, überprüfen Sie die Zeichenfolgenlänge, bevor Sie dies versuchen.

  • Danke, sehr informativ. Ist es möglich, die ersten n Bytes einer Zeichenfolge auszudrucken, wenn Sie nicht wissen, was n zur Kompilierzeit ist? Angenommen, n war ein Int, könnte ich einfach printf(“%ns”, string); ? Warum steht in Ihrem “printf (“%5.5s\n”, string);” auch “5.5” statt nur “5”? (und ähnlich 3.3 im anderen)?

    – Tim

    15. Oktober 2011 um 22:02 Uhr

  • Timo: Ja. Sehen Sie sich den Formatbezeichner %*s an. Grundsätzlich geben Sie direkt vor der Zeichenfolge ein int an, das die Breite der Zeichenfolge angibt.

    – Jörgen Sigvardsson

    15. Oktober 2011 um 22:08 Uhr


  • @Tim: ja, Jörgen hat schon gesagt, wie man sowas benutzt int x = 3; printf ("%.*s, x, "abcde"). Was die angeht zwei Zahlen, das ist in diesem Fall nicht wirklich notwendig, da Sie wissen, dass Sie genug Zeichen haben, aber ich mache es trotzdem aus Gewohnheit. Bei Saiten sind es effektiv die Mindest- und Höchstlängen. Ich werde es herausnehmen, da es hier überflüssig ist.

    – paxdiablo

    15. Oktober 2011 um 22:13 Uhr


  • @JörgenSigvardsson: Ich glaube du meinst das %.*s Formatbezeichner, nicht der %*s Formatbezeichner.

    – Flimmer

    29. April 2014 um 16:51 Uhr

  • Beachten Sie, dass printf wird immer noch beim ersten Nullzeichen anhalten.

    – Flimmer

    29. April 2014 um 16:59 Uhr

Zwei Lösungen:

Angenommen, eine vorhersagbare Zeichenfolge mit derselben Länge ist gegeben. Ich werde das Datum als Beispiel verwenden und darum bitten, es in HH:MM:SS.DDDDDDD aufzuteilen

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 auf die richtige Länge prüfen, um unvorhersehbares Verhalten zu vermeiden.

In beiden Fällen lautet die Ausgabe:

23:59:59.1234567

1419130cookie-checkIst es möglich, nur einen bestimmten Abschnitt eines C-Strings auszudrucken, ohne einen separaten Teilstring zu erstellen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy