Come copiare o concatenare due char*

Come si fa a concatenare o copia char* insieme?

char* totalLine;

const char* line1 = "hello";
const char* line2 = "world";

strcpy(totalLine,line1);
strcat(totalLine,line2);

Questo codice genera un errore!

segmentation fault

Direi che avrei bisogno di allocare la memoria per totalLine?

Un’altra questione è che la copia di memoria o copiare i dati?

char* totalLine;

const char* line1 = "hello";

 totalLine = line1;

Grazie in anticipo! 🙂

  • Basta cambiare char* totalLine per char totalLine[12] (anche se tenere a mente il tuo codice è C e non C++)
  • Si può sempre attaccare loro in alta e bassa ordine di byte di un breve 😉
  • Perché non si utilizza std::string? Magicamente risolve tutti i problemi.
InformationsquelleAutor mister | 2012-05-15

 

3 Replies
  1. 15

    Direi che avrei bisogno di allocare la memoria per totalLine?

    Sì, avete indovinato correttamente. totalLine è un puntatore non inizializzato, quindi, a quelli strcpy chiama sta tentando di scrivere da qualche parte casuale in memoria.

    Per fortuna, come hai taggato questo C++, non c’è bisogno di preoccuparsi di tutto questo. Basta fare questo:

    #include <string>
    
    std::string line1 = "hello";
    std::string line2 = "world";
    
    std::string totalLine = line1 + line2;

    Non la gestione della memoria richiesto.

    fa la copia di memoria o copiare i dati?

    Penso che intendi con “è la stringa sottostante copiato, o semplicemente il puntatore?”. Se è così, allora solo il puntatore.

    • Ciao grazie per la risposta! io sono sempre dati da un file e poi strtok, di conseguenza io sono in un char* format. come faccio a convertirlo in stringa? ovvero, come faccio a risolverlo?
    • std::string ha un costruttore da char *, basta usare quella.
    • Con riferimento al collegamento, che cosa se non si conosce la dimensione del testo? quindi come faccio a convertire una stringa?
    • Non c’è bisogno di conoscere la dimensione. const char *foo = "whatever"; std::string bar = foo; dovrebbe funzionare bene.
    • +1: 10 upvotes in 7 minuti.
    • ohhhhhh…. grazie! 🙂
    • Probabilmente non dovrebbe essere utilizzando strtok(). Si dovrebbe fare un’altra domanda su come raggiungere l’attività che si sta facendo in C++ (come è ovvio che scrivendo C e non C++).
    • questa risposta non mostra come concatenare due puntatori a char
    • Sì, perché è (di solito) insane in C++. Questo risponde alla domanda reale, che è “come faccio a concatenare due stringhe?”.

  2. 7

    Sì, è necessario allocare la memoria per totalLine. Questo è un modo per farlo; capita di essere il mio modo consigliato di farlo, ma ci sono molti altri modi che sono altrettanto buone.

    const char *line1 = "hello";
    const char *line2 = "world";
    
    size_t len1 = strlen(line1);
    size_t len2 = strlen(line2);
    
    char *totalLine = malloc(len1 + len2 + 1);
    if (!totalLine) abort();
    
    memcpy(totalLine,        line1, len1);
    memcpy(totalLine + len1, line2, len2);
    totalLine[len1 + len2] = '\0';

    [EDIT: ho scritto questa risposta, supponendo che questo è stato un C domanda. In C++, come Oli consiglia, basta usare std::string. ]

    • Perché non strcpy e strcat?
    • Penso che chiamare strlen di fronte, quindi memcpy con la stessa lunghezza variabile(s) utilizzato in malloc, rende più chiara per i futuri lettori del mio codice che non c’è alcuna possibilità di un buffer overflow. Inoltre, non importa in questo caso, ma se ci fossero N stringhe concatenate, utilizzando strcat renderebbe l’operazione O(N2).
  3. 0

    totalLine ha un valore di garbage

    const char* Line1{ "Hallo" };  
    const char* Line2{ "World" };   
    char* TotalLine{ new char[strlen(Line1) + strlen(Line2) + 1] };
    
    TotalLine = strcpy(TotalLine, Line1);
    TotalLine = strcat(TotalLine, Line2);

    Nota=> Se si lavora su Visual Studio è necessario #define _CRT_SECURE_NO_WARNINGS

Lascia un commento