Naw*_*waz 145
首先,不要使用char*或char[N].使用std::string,然后其他一切变得如此简单!
例子,
std::string s = "Hello";
std::string greet = s + " World"; //concatenation easy!
Run Code Online (Sandbox Code Playgroud)
容易,不是吗?
现在,如果您char const *出于某种原因需要,例如当您想要传递给某个函数时,那么您可以这样做:
some_c_api(s.c_str(), s.size());
Run Code Online (Sandbox Code Playgroud)
假设此函数声明为:
some_c_api(char const *input, size_t length);
Run Code Online (Sandbox Code Playgroud)
std::string从这里开始探索自己:
希望有所帮助.
nog*_*ard 30
既然是C++,为什么不用std::string而不是char*?连接将是微不足道的:
std::string str = "abc";
str += "another";
Run Code Online (Sandbox Code Playgroud)
Ton*_*nyK 12
如果您使用C编程,那么假设您name确实是一个固定长度的数组,那么您必须执行以下操作:
char filename[sizeof(name) + 4];
strcpy (filename, name) ;
strcat (filename, ".txt") ;
FILE* fp = fopen (filename,...
Run Code Online (Sandbox Code Playgroud)
你现在看到为什么每个人都推荐std::string?
从移植的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;
}
Run Code Online (Sandbox Code Playgroud)
...然后...
char s1[] = "file_name";
char *c = con(s1, ".txt");
Run Code Online (Sandbox Code Playgroud)
......其结果是file_name.txt.
您也可能想要编写自己的operator +IIRC运算符重载但只有指针作为参数是不允许的.
另外,不要忘记这种情况下的结果是动态分配的,所以你可能想要调用delete来避免内存泄漏,或者你可以修改函数来使用堆栈分配的字符数组,当然它提供了足够的长度.