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


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

7 66
c++

7 ответов:

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

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

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

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

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

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

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

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

кстати, хотя 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] = '';
    return result;
}

...и...

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

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

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

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

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

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

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

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

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

    char greeting[6] = {'H', 'e', 'l', 'l', 'o', ''};
    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
//String appending
#include <iostream>
using namespace std;

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

    while(*str2 != ''){
        *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;
}