webentwicklung-frage-antwort-db.com.de

Kann ich nur einen bestimmten Abschnitt eines C-Strings ausdrucken, ohne einen separaten Teilstring zu erstellen?

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?

59
Tim

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;
}
107
Robᵩ

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.

21
paxdiablo

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
0
Kapil Vyas