3 Stimmen

Verkettung von Zeichenketten mit strcpy

Hier ist mein Code

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {

 char f[] = "First";
 char s[] = "Second";
 char *tmp = malloc(strlen(f) + strlen(s) + 2);
 strcpy(tmp, f);
 strcpy(tmp, s);
 printf("%s", tmp);
 free(tmp);
 return 0;
}

Ich versuche, f und s zu verketten. Das Problem ist, dass tmp nur "Second" als Array enthält. Was ich hier vermisse

6voto

Daniel Fischer Punkte 178428

strcpy die Zeichenkette an den Anfang des Ziels kopiert, wollen Sie strcat stattdessen.

3voto

duedl0r Punkte 9112

Die zweite strcpy überschreibt die vorherige. Beide kopieren ihren Inhalt in den tmp-Zeiger (an dessen Anfang). Sie sollten tmp+strlen(f) .

Oder noch besser strcat .

Und noch besser ist es, sicherere Methoden wie diese zu verwenden: strncpy , strncat , usw..

2voto

Sergey Kalinichenko Punkte 694383

Wenn Sie darauf bestehen, die strcpy sollte Ihr Code leicht geändert werden:

int main() {
    const char *f = "First";
    const char *s = "Second";
    char *tmp = malloc(strlen(f) + strlen(s) + 1);
    strcpy(tmp, f);
    strcpy(tmp+strlen(f), s);
    printf("%s", tmp);
    free(tmp);
    return 0;
}

Sie sollten Folgendes in Betracht ziehen strncpy 代わりに strcpy aus Sicherheitsgründen. Auch, strcat ist eine konventionellere Funktion zur Verkettung von C-Strings.

EDIT Hier ist ein Beispiel für die Verwendung strncpy 代わりに strcpy

#define MAX 1024

int main() {
    const char *f = "First";
    const char *s = "Second";
    size_t len_f = min(strlen(f), MAX);
    size_t len_s = min(strlen(s), MAX);
    size_t len_total = len_f + len_s;
    char *tmp = malloc(len_total + 1);
    strncpy(tmp, f, len_f);
    strncpy(tmp+len_f, s, len_s);
    tmp[len_total] = '\0';
    printf("%s", tmp);
    free(tmp);
    return 0;
}

1voto

ouah Punkte 138337

Sie können Folgendes verwenden strcat anstelle Ihres zweiten strcpy Anruf, etwa so:

strcpy(tmp, f);
strcat(tmp, s);

Beachten Sie auch, dass die Zuweisung von strlen(f) + strlen(s) + 1 Bytes für tmp ausreicht, ist keine Zuweisung von strlen(f) + strlen(s) + 2 Bytes. Nach der Verkettung erhalten Sie nur eine Zeichenfolge, so dass nur ein Nullzeichen erforderlich ist.

1voto

sharptooth Punkte 162790

Das Problem ist, dass Sie die zweite Zeichenkette anstelle der ersten kopieren (der erste Parameter von strcpy() ist der Ort, an dem kopieren. die Zeichenfolge), wodurch die erste Zeichenfolge überschrieben wird. Hier ist eine Idee, was Sie brauchen:

size_t firstLen = strlen( f );
size_t secondLen = strlen( s );    
char *tmp = malloc(firstLen + secondLen + 1);
strcpy(tmp, f);
strcpy(tmp + firstLen, s);

Dies kann erreicht werden durch die Verwendung von strcat() obwohl dies zu einem zusätzlichen Scan entlang der kopierten Zeichenfolge führen würde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X