Відповіді:
Перш за все, не використовуйте 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";
operator+=виконує як розподіл, так і розподіл. Купи розподілу є одними з найдорожчих операцій, які ми зазвичай робимо.
Якщо ви програмували на C, то, якщо ви вважаєте, що це nameсправді масив фіксованої довжини, як ви говорите, вам потрібно зробити щось на кшталт наступного:
char filename[sizeof(name) + 4];
strcpy (filename, name) ;
strcat (filename, ".txt") ;
FILE* fp = fopen (filename,...
Тепер ви бачите, чому всі рекомендують std::string?
Існує функція strcat () з перенесеної бібліотеки C, яка зробить для вас конкатенацію "Строка стилю C".
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 перевантажує лише покажчики, оскільки аргументи заборонені.
Крім того, не забувайте, що результат у цьому випадку динамічно розподіляється, тому ви можете зателефонувати видалити на ньому, щоб уникнути витоку пам'яті, або ви могли змінити функцію для використання масиву символів, виділених стеком, якщо, звичайно, вона має достатню довжину.
strncat()функція, яка, як правило, краща альтернатива
strncatтут не має значення, оскільки ми вже знаємо довжину другого параметра ".txt". Так було б просто strncat(name, ".txt", 4), що нас нічого не отримує.
strcat (призначення, джерело) може використовуватися для об'єднання двох рядків у c ++.
Щоб мати глибоке розуміння, ви можете шукати за наступним посиланням-
Краще використовувати струнний клас C ++, а не старий стиль C string, життя було б набагато простіше.
якщо у вас є старий рядок стилю, ви можете перейти до класу 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
//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;
}