c:
#include<iostream>
using namespace std;
int main()
{
const char *str1 = "ni hao";
const char *str2 = "Li ming";
const size_t len = strlen(str1)+strlen(str2);
char *n_str = malloc((char*)*(len+1));//new char[len+1];
strcpy(n_str,str1);//初始化内存,才能用strcat,strcat其实连接的是内存(个人理解,不然的话,会内存错误)
strcat(n_str,str2);
free(n_str);//delete [] n_str;
return 0;
}
在做路径拼接时,可借鉴这种方法,注意要初始化指针(strcpy),然后strcat
c++ string字符串
#include <iostream>
#incldue <string>
using namespace std;
int main()
{
const string str1 = "ni hao ";
const string str2 = "Li ming";
string n_str;
n_str = str1;
n_str +=str2;
cout<<n_str<<endl;
return 0;
}
特别是注意在函数传参时,参数为指针时,分配内存。偶尔看到一个介绍参数为数组时注意点,参数为数组时,数组大小str[2];中传入函数时,其实只是一个首地址,sizeof()只是类型大小,下面为转载:
C/C++函数传参时数组不是传值的
错误代码:
ID_INLINE mat3_t::mat3_t( float src[ 3 ][ 3 ] ) {
memcpy( mat, src, sizeof( src ) );
}
解释一下:
C/C++中函数是不能以传值的方式传入数组的,有时我们会忘记这一点。如果真这么做了,实际上只是传入了指向这个数组的指针(数组中第一个元素的地址),而不是整个数组。方括号中的数字基本是没啥作用的。它们仅仅提醒了一下程序员并记录了一下传入的这个数组的大小(而对编译器没啥子用啦)。实际上传入数组的大小是不受声明时大小影响的,下面代码是可以编译成功的:
void F(int p[10]) { }
void G(){
int p[3];
F(p);
}
因此,错误代码中的sizeof(src)并不会返回数组的大小,而是指针的大小。所以memcpy()只是复制了数组的一部分,也就一个指针的大小 4个或8个字节(特殊情况不予考虑)。
正确代码:
最简单的的改进方式如下所示:
ID_INLINE mat3_t::mat3_t( float src[ 3 ][ 3 ] ) {
memcpy(mat, src, sizeof(float) * 3 * 3);
}
推荐方法:
当然还有一些更牢靠的方法。
如果数组的大小是已知的,你可以把数组以引用的方式传入。当然不是所有人都能想到这种方法,甚至一些人根本写不出来这样的代码。所以我希望这个例子既有趣又有用:
ID_INLINE mat3_t::mat3_t( float (&src)[3][3] )
{
memcpy( mat, src, sizeof( src ) );
}
使用std::array 解决这种问题的另一种方法。
如果数组的大小是未知的,一些作者建议使用 std::vector,或者类似的类。当然在实际情况中有时也不合适。
如果你只想使用简简单单的指针,那就向函数中传入两个参数:一个指针和一个数量。然而这也不是一个好主意,通常也会引起好多bug。
这种情况下,”C++ Core Guidelines”的一些方法可能有用,可以读一读。我的建议是”Do not pass an array as a single pointer”这篇文章。不过呢,”C++ Core Guidelines”还是不错的,其中有很多实用的办法,有时间还是值得一读的。
最近看见一个讲C++的系列文章,主要是关于一些开源项目中遇到的常见问题和一些建议,感觉不错,分享给大家。原站在这http://cpphints.com/。
随意转载,注明出处即可。
原文链接: http://cpphints.com/hints/38