Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Прежде всего, не используйте 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 самостоятельно, начиная отсюда:

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

Ответ 2

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

std::string str = "abc";
str += "another";

Ответ 3

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

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

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

Ответ 4

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

Кстати, хотя С++ имеет кучу функций для работы со строками 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 только указателями, поскольку аргументы не разрешены.

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

Ответ 5

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

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

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

Ответ 6

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

если у вас есть существующая старая строка стиля, вы можете скрывать класс 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

Ответ 7

//String appending
#include<iostream>
using namespace std;
void stringconcat(char *str1, char *str2){
while (*str1 != '\0'){
    str1++;
}
while(*str2 != '\0'){
    *str1 = *str2;
    str1++;
    str2++;
}
return ;    
}
int main(   ){
char str1[100];
 cin.getline(str1,100);  
char str2[100];
cin.getline(str2,100);
stringconcat(str1,str2);
cout<<str1;
getchar();
return 0;
}