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

本文详细介绍了C++中动态数组的使用方法,包括如何根据字符串长度动态分配内存,以及复制字符串时应注意的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动态数组的使用:

    通常因为在编译时无法知道数组的维数,所以才需要动态创建该数组。例如,在程序执行过程中,常常使用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);

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

#include<iostream> using namespace std; class String { char* str; int len; public: String(char*n=nullptr):str(nullptr),len(0) { if(n){ str = new char[strlen(n) + 1]; strcpy(str, n); len = strlen(str); } } String(String& n) { if (n.str) { str = new char[strlen(n.str) +1]; strcpy(str, n.str); len = n.len; } else { str = nullptr; len = 0; } } ~String() { delete[]str; } void set(char* n) { delete[]n; if (n) { str = new char[strlen(n) + 1]; strcpy(str, n); len = strlen(n); } else { str = nullptr; len = 0; } } void show() { cout << (str ? str : "") << endl; } int getlen() { return len; } void delchar(char n) { int b = 0; char* m = new char[getlen() + 1]; for (int a = 0;a < getlen();a++) { if (str[a] != n) { m[b] = str[a]; b++; } } m[b] = '\0'; delete[]str; str = new char[strlen(m) + 1]; strcpy(str, m); len = strlen(m); delete[]m; } String &operator-(char n) { delchar(n); return *this; } String& operator=(String& n) { if (*this == n) { return *this; } if (n.str) { delete[]str; str = new char[n.getlen() + 1]; strcpy(str,n.str); len = n.len; } else { str = nullptr; len = 0; } return*this; } String& operator+=(String& n) { if (n.str&&str) { String m; m.str = new char[len + n.len + 1]; int a = 0; for (;a < len;a++) { m.str[a] = str[a]; } for (int b=0;a < len + n.len;a++,b++) { m.str[a] = n.str[b]; } m.str[a] = '\0'; delete[]str; str = new char[strlen(m.str) + 1]; strcpy(str, m.str); } return*this; } bool operator==( String& n) { if (strcmp(str, n.str)) { return false; } else { return true; } } friend String operator+(String&,String&); }; String operator+(String&n, String&m) { String res; res.str = new char[n.len + m.len + 1]; int a = 0; for (;a < n.len;a++) { res.str[a] =n. str[a]; } for (int b = 0;a < m.len + n.len;a++, b++) { res.str[a] = m.str[b]; } m.str[a] = '\0'; res.len = strlen(res.str); return res; }
03-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值