2016-04-17 13 views
0

I von 2 Strings aus String ‚scr‘ diese Weise kopiert eine große Zeichenfolge ‚des‘ erstellen möchten:einen String aus 2 Teil Schaffung

Ich möchte die Teil kopieren, nennen wir es - ‚string1‘ (von ptr x bis zum Ende der 'scr' Zeichenkette), um sie dann in das 'des' einzufügen und danach mit einer anderen Teilzeichenkette zu verketten, laßt es 'string 2' von der 'scr' Zeichenkette aus der Kopf der Zeichenfolge zu x ptr. Wie kann ich es tun keine temporäre Zeichenfolge verwenden?

zum Beispiel: scr = "ThisIs", string1 = "Ist", string2 = "Diese" des = "IsThis"

Ich will nicht eine temporäre Zeichenfolge verwenden string 1 oder string2 halten .

Können Sie mir helfen?

+0

Ist 'des' Zeiger gleich' scr' Zeiger? – Marian

+0

vielleicht können Sie memcpy() verwenden. Es würde dir helfen. aber sicher sein, dass "des" genug Platz hat, um den ganzen Inhalt zu halten – sam

Antwort

1

Sie benötigen keine temporäre Zeichenfolge, Sie benötigen nur einen Zeiger, um die Grenze der Teilzeichenfolgen zu halten. Versuchen Sie folgendes:

char src[] = "ThisIs"; 
char dst[7] = {'\0'}; 
int len = strlen(src); 
int str1len = 4; 
strncpy(dst, src + str1len, len - str1len); 
strncpy(dst + len - str1len, src, str1len); 
printf("src=%s, dst=%s\n", src, dst); 
1

Wenn Sie die Position des zweiten Strings kennen, können Sie einfach die beiden Teile zu dem Zielstring in umgekehrter Reihenfolge drucken:

char *src = "ThisIs";  // source string 
char dst[7];    // char buffer for destination string 

int pos = 4;    // position of second substring 

snprintf(dst, sizeof(dst), "%s%.*s", src + pos, pos, src); 
puts(dst); 

Erläuterung:

  • snprintf schreibt formatierte Daten in eine Zeichenfolge, wie printf formatierte Daten auf dem Bildschirm schreibt. Es nimmt die Pufferlänge als zweites Argument und verwendet es, um sicherzustellen, dass der Puffer nicht überläuft. Es garantiert auch, dass der resultierende String null terminiert ist.
  • Wenn die Ausgabe eine Zeichenfolge mit mehr Zeichen als der Puffer enthalten würde, wird die Ausgabe abgeschnitten. snprintf gibt die Länge zurück, die die Zeichenfolge hätte, wenn der Puffer unendlich groß wäre. Mit diesem Rückgabewert können Sie überprüfen, ob die Ausgabe abgeschnitten wurde.
  • Die zweite Teilzeichenfolge ist nullterminiert, da sie endet, wenn die gesamte Zeichenfolge src endet. Sie können es mit printf("%s", str + pos) drucken, wobei pos der Anfang der Teilzeichenfolge ist.
  • Der erste Teilstring ist nicht null terminiert. Sie können Teilstrings beliebiger Länge drucken, indem Sie dem Format %s nach einem Punkt eine "Genauigkeit" zuweisen: printf("%.4s", str).
  • Sie können diese Präzision Variable machen, indem Sie einen Stern im Format verwenden und dann ein zusätzliches int Argument vor dem eigentlichen Argumente bereitstellt: printf("%.*s", 4, str)

Diese Antwort am Herzen wie fluter ist die gleiche Antwort, aber es schützt vor Pufferüberlauf und beinhaltet weniger Längenberechnungen.

+0

Eigentlich versuche ich einen RingBuffer in einen LinearBuffer zu kopieren. Nehmen wir an, dass der Ringpuffer handelt es sich um den Typ: ' typedef struct { \t \t RingBuff_Data_t Buffer [BUFFER_SIZE];/** Kobi

+0

Aha. Das ist eine ganz andere Frage. (Weil Sie sich nicht damit beschäftigen müssen, Null-Zeichen zu beenden und weil Sie mit irgendwelchen Daten umgehen wollen.) Ich nehme an, die Positionen "In" und "Out" sind Zeiger. (Die Astersks wurden als '* italic *' Markup behandelt.) –

+0

und mein Code sieht so aus: \t memset(linearBuffer,0,LINEAR_BUFFER_SIZE); \t RingBuff_Data_t* tempIn = buf.In; \t if (buf.Out < tempIn){ \t \t memcpy(linearBuffer,buf.Out,tempIn-buf.Out); \t } \t else if (buf.Out > tempIn){ \t \t strcpy(linearBuffer,buf.Out); \t \t strncpy(linearBuffer+strlen(buf.Out),buf.Buffer,buf.In-buf.Buffer); \t } aber ich bin mir nicht sicher. P.S, wie füge ich einen Code hinzu, damit Sie es leicht lesen können ...? – Kobi