2013-03-10 2 views
48

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

ответ

86

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

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

+0

Какова временная сложность этой конкатенации? – d34th4ck3r

+0

@ d34th4ck3r: Он линейный. – Nawaz

11

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

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

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

BTW, хотя 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-оператора с помощью только указателей в качестве аргументов не допускается.

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

+0

Посмотрите мои комментарии к ответу IcyFlame. – TonyK

+3

Существует также функция 'strncat()', которая обычно лучше альтернатива – nogard

+0

@nogard: 'strncat' здесь не имеет значения, потому что мы уже знаем длину второго параметра' '.txt' '. Таким образом, это будет просто 'strncat (name," .txt ", 4)', что не дает нам ничего. – TonyK

6

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

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

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

+1

Не можете ли вы увидеть, что парень задал вопрос в C++ и не в C ?? – IcyFlame

+9

Разве вы не видите, что я сказал: «Если бы вы программировали ...»? – TonyK

+0

Как вы думаете, этот ответ не имеет значения для этого вопроса? – IcyFlame

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

.......... что я вижу? –

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 
Смежные вопросы