Как объединить две строки в C ++?

100

У меня есть переменная частного класса, char name[10]к которой я хотел бы добавить .txtрасширение, чтобы я мог открыть файл, присутствующий в каталоге.

Как мне это сделать?

Было бы предпочтительнее создать новую строковую переменную, содержащую объединенную строку.

Slashr
источник

Ответы:

160

Прежде всего, не используйте char*или char[N]. Пользуйтесь std::string, тогда все остальное становится так просто!

Примеры,

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

Легко, правда?

Теперь, если вам нужно char const *по какой-то причине, например, когда вы хотите перейти к какой-либо функции, вы можете сделать это:

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

предполагая, что эта функция объявлена ​​как:

some_c_api(char const *input, size_t length);

Изучите std::stringсебя, начиная отсюда:

Надеюсь, это поможет.

Наваз
источник
3
Какова временная сложность этой конкатенации строк?
d34th4ck3r
@ d34th4ck3r: Это линейно.
Nawaz
30

Поскольку это C ++, почему бы не использовать std::stringвместо char*? Конкатенация будет тривиальной:

std::string str = "abc";
str += "another";
ногард
источник
1
Стоит отметить, что тривиальное использование имеет нетривиальную цену в отношении производительности во время выполнения. В худшем случае operator+=выполняется и освобождение, и выделение. Выделение кучи - одна из самых дорогих операций, которые мы обычно выполняем.
Inspectable,
15

Если вы программировали на C, то предполагая, что это nameдействительно массив фиксированной длины, как вы говорите, вам нужно сделать что-то вроде следующего:

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

Теперь вы понимаете, почему все рекомендуют std::string?

TonyK
источник
1
Разве вы не видите, что этот парень задал вопрос на C ++, а не на C ??
IcyFlame
21
Разве вы не видите, что я сказал: «Если бы вы программировали ...»?
TonyK
Вам не кажется, что этот ответ не имеет отношения к этому вопросу?
IcyFlame
9
Я думаю, что это актуально, поскольку «парень» использует char вместо std :: string. Кроме того, он показывает явный способ конкатенации, который не был показан в ответе, получившем наибольшее количество голосов. По крайней мере, я кое-чему научился.
gvegayon
1
Здесь также показан метод конкатенации строк без выделения динамической памяти. Если я не ошибаюсь, std :: string operator + = требует возможного перераспределения.
Эшли Дункан
7

В перенесенной библиотеке C есть функция strcat () , которая выполнит за вас конкатенацию "строки в стиле C".

Кстати, хотя в C ++ есть множество функций для работы со строками в стиле C, это может быть полезно, если вы попытаетесь создать свою собственную функцию, которая делает это, например:

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;
}

...а потом...

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

... результат чего есть file_name.txt.

У вас также может возникнуть соблазн написать свой собственный, operator +однако оператор IIRC перегружается только указателями, поскольку аргументы не разрешены.

Кроме того, не забывайте, что результат в этом случае распределяется динамически, поэтому вы можете вызвать для него delete, чтобы избежать утечек памяти, или вы можете изменить функцию, чтобы использовать массив символов, выделенный стеком, при условии, конечно, что он имеет достаточную длину.

dtech
источник
См. Мой комментарий к ответу IcyFlame.
TonyK
3
Есть также strncat()функция, которая обычно является лучшей альтернативой
nogard
@nogard: strncatздесь не имеет значения, потому что мы уже знаем длину второго параметра ".txt". Так бы и было strncat(name, ".txt", 4), что нам ничего не дает.
TonyK
0

strcat (destination, source) может использоваться для объединения двух строк в C ++.

Чтобы получить более глубокое понимание, вы можете поискать по следующей ссылке -

http://www.cplusplus.com/reference/cstring/strcat/

Мадхурья Ганди
источник
0

Лучше использовать строковый класс C ++ вместо строки C старого стиля, жизнь будет намного проще.

если у вас есть существующая строка старого стиля, вы можете скрыть ее до строкового класса

    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
источник
0

C ++ 14

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

Ответ на вопрос:

auto fname = ""s + name + ".txt";
SM
источник
-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;
}
Картик
источник