c/c++ 拼接字符串 与函数传参时数组不是传值

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++函数传参时数组不是传值的


错误代码:

 
 
  1. ID_INLINE mat3_t::mat3_t( float src[ 3 ][ 3 ] ) {
  2. memcpy( mat, src, sizeof( src ) );
  3. }

解释一下:
C/C++中函数是不能以传值的方式传入数组的,有时我们会忘记这一点。如果真这么做了,实际上只是传入了指向这个数组的指针(数组中第一个元素的地址),而不是整个数组。方括号中的数字基本是没啥作用的。它们仅仅提醒了一下程序员并记录了一下传入的这个数组的大小(而对编译器没啥子用啦)。实际上传入数组的大小是不受声明时大小影响的,下面代码是可以编译成功的:

 
 
  1. void F(int p[10]) { }
  2. void G(){
  3. int p[3];
  4. F(p);
  5. }

因此,错误代码中的sizeof(src)并不会返回数组的大小,而是指针的大小。所以memcpy()只是复制了数组的一部分,也就一个指针的大小 4个或8个字节(特殊情况不予考虑)。

正确代码:
最简单的的改进方式如下所示:

 
 
  1. ID_INLINE mat3_t::mat3_t( float src[ 3 ][ 3 ] ) {
  2. memcpy(mat, src, sizeof(float) * 3 * 3);
  3. }

推荐方法:
当然还有一些更牢靠的方法。
如果数组的大小是已知的,你可以把数组以引用的方式传入。当然不是所有人都能想到这种方法,甚至一些人根本写不出来这样的代码。所以我希望这个例子既有趣又有用:

 
 
  1. ID_INLINE mat3_t::mat3_t( float (&src)[3][3] )
  2. {
  3. memcpy( mat, src, sizeof( src ) );
  4. }

使用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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值