Como concatenar duas strings em C ++?

100

Tenho uma variável de classe privada char name[10]à qual gostaria de adicionar a .txtextensão para poder abrir o arquivo presente no diretório.

Como faço para fazer isso?

Seria preferível criar uma nova variável de string que contenha a string concatenada.

Slashr
fonte

Respostas:

160

Em primeiro lugar, não use char*ou char[N]. Use std::string, então tudo se torna tão fácil!

Exemplos,

std::string s = "Hello";
std::string greet = s + " World"; //concatenation easy!

Fácil, não é?

Agora, se você precisar char const *por algum motivo, como quando deseja passar para alguma função, pode fazer o seguinte:

some_c_api(s.c_str(), s.size()); 

presumindo que esta função seja declarada como:

some_c_api(char const *input, size_t length);

Explore- std::stringse a partir daqui:

Espero que ajude.

Nawaz
fonte
3
Qual é a complexidade de tempo dessa concatenação de string?
d34th4ck3r
@ d34th4ck3r: É linear.
Nawaz
30

Já que é C ++, por que não usar em std::stringvez de char*? A concatenação será trivial:

std::string str = "abc";
str += "another";
nogard
fonte
1
Vale a pena notar, o uso trivial vem com um preço não trivial com relação ao desempenho do tempo de execução. O pior caso é que operator+=executa uma desalocação e uma alocação. As alocações de heap estão entre as operações mais caras que normalmente fazemos.
Inspecionável
15

Se você estava programando em C, então presumindo que namerealmente é uma matriz de comprimento fixo como você diz, você deve fazer algo como o seguinte:

char filename[sizeof(name) + 4];
strcpy (filename, name) ;
strcat (filename, ".txt") ;
FILE* fp = fopen (filename,...

Você vê agora por que todo mundo recomenda std::string?

TonyK
fonte
1
Você não consegue ver que o cara fez uma pergunta em c ++ e não em C ??
IcyFlame de
21
Você não vê que eu disse "Se você estivesse programando ..."?
TonyK
Você não acha que esta resposta é irrelevante para esta pergunta?
IcyFlame de
9
Eu acho que isso é relevante, já que "o cara" está usando char em vez de std :: string. Além disso, mostra uma forma explícita de concatenação que não foi mostrada na resposta mais votada. Pelo menos aprendi algo com isso.
gvegayon
1
Isso também mostra um método de fazer uma concatenação de string sem alocação de memória dinâmica. A menos que eu esteja errado, std :: string operator + = requer uma possível realocação.
Ashley Duncan
7

Há uma função strcat () da biblioteca C portada que fará a concatenação de "string de estilo C" para você.

BTW, embora C ++ tenha um monte de funções para lidar com strings de estilo C, pode ser benéfico para você tentar criar sua própria função que faça isso, algo como:

char * con(const char * first, const char * second) {
    int l1 = 0, l2 = 0;
    const char * f = first, * l = second;

    // step 1 - find lengths (you can also use strlen)
    while (*f++) ++l1;
    while (*l++) ++l2;

    char *result = new char[l1 + l2];

    // then concatenate
    for (int i = 0; i < l1; i++) result[i] = first[i];
    for (int i = l1; i < l1 + l2; i++) result[i] = second[i - l1];

    // finally, "cap" result with terminating null char
    result[l1+l2] = '\0';
    return result;
}

...e depois...

char s1[] = "file_name";
char *c = con(s1, ".txt");

... o resultado disso é file_name.txt.

Você também pode ficar tentado a escrever seu próprio, operator +no entanto, o operador IIRC sobrecarrega apenas com ponteiros, pois os argumentos não são permitidos.

Além disso, não se esqueça de que o resultado neste caso é alocado dinamicamente, então você pode querer chamar delete nele para evitar vazamentos de memória, ou você pode modificar a função para usar array de caracteres de pilha alocada, desde que tenha comprimento suficiente.

dtech
fonte
Veja meu comentário sobre a resposta de IcyFlame.
TonyK de
3
Há também uma strncat()função que geralmente é uma alternativa melhor
nogard de
@nogard: strncaté irrelevante aqui, porque já sabemos o comprimento do segundo parâmetro ".txt". Assim seria strncat(name, ".txt", 4), o que não nos ganha nada.
TonyK
0

É melhor usar a classe string C ++ em vez da string C no estilo antigo, a vida seria muito mais fácil.

se você tem uma string de estilo antigo existente, você pode converter para a classe de string

    char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
    cout<<greeting + "and there \n"; //will not compile because concat does \n not work on old C style string
    string trueString = string (greeting);
    cout << trueString + "and there \n"; // compiles fine
    cout << trueString + 'c'; // this will be fine too. if one of the operand if C++ string, this will work too
i.AsifNoor
fonte
0

C ++ 14

std::string great = "Hello"s + " World"; // concatenation easy!

Responda à pergunta:

auto fname = ""s + name + ".txt";
SM
fonte
-2
//String appending
#include <iostream>
using namespace std;

void stringconcat(char *str1, char *str2){
    while (*str1 != '\0'){
        str1++;
    }

    while(*str2 != '\0'){
        *str1 = *str2;
        str1++;
        str2++;
    }
}

int main() {
    char str1[100];
    cin.getline(str1, 100);  
    char str2[100];
    cin.getline(str2, 100);

    stringconcat(str1, str2);

    cout<<str1;
    getchar();
    return 0;
}
Kartik
fonte