动态数组的使用之char *res=new char(strlen(src)+1)

动态数组的使用:

    通常因为在编译时无法知道数组的维数,所以才需要动态创建该数组。例如,在程序执行过程中,常常使用char *指针指向多个C风格字符串,于是必须根据每个字符串的长度实时地动态分配存储空间。采用这种技术要比建立固定大小的数组安全。如果程序员能够准确计算出运行时需要的数组长度,就不必再担心数组变量具

有固定的长度而造成的溢出问题。


 

关于动态数组的使用我们举一个例子:
    比如,希望把字符串复制到另一个字符中。我在这里再次强调,尽管C++中使用的是string。我还是要掌握住Char数组的形式。所以在这里我先使用数组的形式。
char *src="abcd";
   上面一句话的意思是,是src指向一个字符串。字符串的长度我们可以使用函数:strlen(src)来计算,可想而知,这个长度是4。它不包含字符串结束符''。下面我们定义一个目标字符串,仍然使用char指针的形式:
char *des;
   我们很自然的想起函数strncpy(char *des, char *src, int len),意思是从原字符串复制len长度个数的字符到目标字符串。注意了,注意了,如果使用:strncpy(des,src,strlen(src)),这里会有两个错误,你知道吗?
   第一个错误:
             des没有使用new或malloc的方式分配内存空间,所以它实际上还是一个null。
   第二个错误:
             在改正第一个错误之后:
             char *des=new char[strlen(src)];
             strncpy(des,src,strlen(src));
             首先是开辟了一个strlen(src)长度的内存空间,并且复制目标串。注意一下过程:
             src在内存中状态为:
             ['a','b','c','d','']
             我们在使用strlen(src)计算src长度的时候,得到的长度为4。
             所以上面char *des=new char[strlen(src)];事实上开辟了4个字节的空间,而复制也是复制了4个字符,按道理来说是没有错误的。可是结果呢?我们使用cout<<res<<endl;输出结果却是abcd XXX 一段乱码。究其原因无论是C中还是C++中,字符串的结尾都是''。虽然我们申请了4个空间,但是却意外的被多复制

了几个未知字符。为了解决这个问题。

   我们如下处理:

               char *src="abcd";
               char *des = new char[strlen(src)+1];
               strncpy(des,src,strlen(src)+1);

   这样就是多申请了一个结束符空间,并且在复制的时候,复制此结束符。红色为正确书写方式。一定要多加注意。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是实现代码: ```c #include <stdio.h> #include <string.h> void add_float(char* a, char* b, char* res) { int len_a = strlen(a); // a 的长度 int len_b = strlen(b); // b 的长度 int len_res = len_a > len_b ? len_a : len_b; // 结果字符串的最大长度,取 a 和 b 中较长的那个 int carry = 0; // 进位标志 int i, j, k; // 将 a 和 b 补齐到同样的长度,高位补 0 char tmp_a[len_res+1]; char tmp_b[len_res+1]; memset(tmp_a, '0', sizeof(tmp_a)); memset(tmp_b, '0', sizeof(tmp_b)); for (i = len_a-1, j = 0; i >= 0; i--, j++) { tmp_a[j+len_res-len_a] = a[i]; } for (i = len_b-1, j = 0; i >= 0; i--, j++) { tmp_b[j+len_res-len_b] = b[i]; } // 从低位到高位进行逐位相加 for (i = len_res-1, k = 0; i >= 0; i--, k++) { int sum = tmp_a[i]-'0' + tmp_b[i]-'0' + carry; carry = sum / 10; res[k] = sum % 10 + '0'; } // 如果最高位有进位,结果字符串长度要加 1 if (carry) { res[len_res] = carry + '0'; len_res++; } // 将结果字符串翻转过来 for (i = 0, j = len_res-1; i < j; i++, j--) { char tmp = res[i]; res[i] = res[j]; res[j] = tmp; } // 如果结果字符串是空串,说明 a 和 b 都是 0 if (len_res == 0) { res[0] = '0'; len_res = 1; } // 在结果字符串后面加上小数点 res[len_res] = '.'; len_res++; // 计算小数部分 int index_a = len_a-1; // a 的当前位数 int index_b = len_b-1; // b 的当前位数 while (index_a >= 0 || index_b >= 0) { int digit_a = 0, digit_b = 0; if (index_a >= 0) { digit_a = a[index_a] - '0'; index_a--; } if (index_b >= 0) { digit_b = b[index_b] - '0'; index_b--; } int sum = digit_a + digit_b + carry; carry = sum / 10; res[len_res] = sum % 10 + '0'; len_res++; } // 如果小数部分最高位有进位,结果字符串长度要加 1 if (carry) { res[len_res] = carry + '0'; len_res++; } // 在结果字符串末尾加上结束符 res[len_res] = '\0'; } ``` 函数的实现思路如下: 1. 首先获取两个浮点数的长度,然后将它们补齐到同样的长度,高位补 0。 2. 从低位到高位进行逐位相加,同时记录进位标志。 3. 如果最高位有进位,结果字符串长度要加 1。 4. 将结果字符串翻转过来。 5. 在结果字符串后面加上小数点。 6. 计算小数部分,从高位到低位逐位相加,同时记录进位标志。 7. 如果小数部分最高位有进位,结果字符串长度要加 1。 8. 在结果字符串末尾加上结束符。 注意事项: 1. 实现中使用了字符数组进行字符串操作,需要注意数组的长度要足够大,否则会造成内存访问越界。 2. 实现中使用了进位标志,需要注意进位的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值