使用new delete定义一个未知长度的charchar 字符串连接组

C++&中输入一个未知长度字符串
一个“很简单”的问题,折磨到头疼:
手动输入一个未知长度的字符串.
通常我们会申请一个足够大的内存空间,来保证不超出存储范围:
char* input=new char[100];
此时申请到一个长度为100的字符数组并输入。
如果不想申请固定大小的空间,本人写了如下的程序:
char* input=new char(); //圆括号中是初始化参数
在一系列使用该变量时没有出现逻辑和语法错误,但是在程序最后,释放内存空间时
却出现莫名奇妙的中断错误。改为出现同样的错误。
这个错误原因现在也没有搞明白,猜测是由于申请内存空间时,只申请了1个字符长度的空间,但是访问超出了该地址,虽然对其他地址进行操作时认为合法并可以正确使用,但是在释放空间时出现该未知的中断错误。
此时需要使用string类进行处理,须包含头文件
#include &string&
此时输入了一个字符串,储存到string类型变量input中。如果需要将其转换为我们常用的char型数组,须再次调用string类函数
data 或 c_str 。
const char* input0=input.data(); 或 const char*
input0=input.c_str();
这里string类的两个函数data和c_str得到的是const变量,因此不能写成 char*
input0=input.data();(因为const变量不能隐士转化为非const变量。)
然后就可以进行其他char型数据的操作,只是不能修改input0中的数据。例如可以获得字符串长度:
int len=strlen(input);
如果需要进行操作,就可以根绝该长度申请合适的内存空间即可。
到这里,问题就解决了。
----------------------------------------------分割线-------------------------------------------------------------------网上有人这样写,可以不用固定长度,也不使用string类实现该功能--------------------------------------------------------没有测试,留作以后学习-------------------------------------
每次在写入一个字符就对字符串使用realloc函数重新分配空间,这样就可以做到动态分配内存,下面写了一个小例子,希望可以帮到你。
int main(int argc, char** argv)
int strLen = 5;
char* str = (char*)malloc(sizeof(char*) * strLen);
int count = 0;
printf("Please input a string: ");
ch = getchar();
if (count &= strLen)
str = (char*)realloc(str, sizeof(char*) * (++strLen));
str[count-1] =
} while (ch != '\n');
str[count] = '\0';
puts(str);
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。4739人阅读
C/C++(74)
:又叫做堆。每一个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区或堆。
size_t n = get _size();
int& *p = new int [n];
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:207488次
积分:3648
积分:3648
排名:第5897名
原创:122篇
转载:195篇
评论:22条
(21)(10)(17)(14)(1)(2)(3)(4)(1)(13)(19)(13)(6)(1)(4)(22)(13)(1)(9)(2)(1)(4)(3)(3)(14)(3)(6)(7)(1)(2)(4)(1)(1)(13)(11)(12)(6)(10)(1)(3)(1)(2)(6)(13)(5)(7)C++ 求帮助。两个问题:1怎么定义一个正整数? 2怎么定义一个未知长度的一维数组(长度由输入确定)? 破解 - 谷普下载┆┆┆┆┆站内软件文章
| 当前位置: →
→ C++ 求帮助。两个问题:1怎么定义一个正整数? 2怎么定义一个未知长度的一维数组(长度由输入确定)?作者:佚名 来源:互联网 更新时间: 00:05:06与好友分享: 更多网友提问:C++ 求帮助。两个问题:1怎么定义一个正整数? 2怎么定义一个未知长度的一维数组(长度由输入确定)?
参考答案:#include &iostream&
void main( )
unsigned int a = 0,b;
// 定义一个正整数
cin&&a; // 长度由输入确定
array = new int[a];
// 定义一个未知长度的一维数组(长度由输入确定
// 使用数组
for(b=0;b&a;b++)
array[b]=b;
for(b=0;b&a;b++)
cout&&array[b]&&" ";
//释放内存
//以上都定义一个正整数,范围不一样...
类型指针 p=new
类型[数量]
类型指针 p=(类型*)malloc [数量*sizeof(类型)]定义一个正整数有4种方法:
unsigned int a;
//最常用的
unsigned short a;//short是短整型
unsigned long a; //long是长整型
unsigned char a; //char是字符型,这种方法可定义正整型,亦可定义字符变量
定义未知长度的数组:
//定义一个整型变量来记录你要输入的数组长度
/*定义一个指针变量作为数组的首元素地址,array亦即数组名,int是类型名,表示数组是整型数组*/
//输入你要定义的数组长度。
array=new int[a];
//为你的数组在内存中开辟一小段空间,并将其首地址赋值给array。也就是定义好了一个以“array”为数组名,长度为a的整型数组。
[] [] [] []?上一篇文章:   ?下一篇文章:文章栏目导航 |
| 本类热门文章
按字母检索:
按声母检索:
站内网页综合 |
| CopyRight(c)2007-
谷普下载 All Rights Reserved.一道基础C语言题,求解,最好附上这部分的知识点(通俗易懂点)。_百度知道
一道基础C语言题,求解,最好附上这部分的知识点(通俗易懂点)。
动态分配了10个整型存储区域:产生动态数组。题目如下,顺便再讲讲分配存储区是怎么回事的,没注意听!!。拜托帮我写出这个题的答案,现在求高手教导。在下感激不尽,然后进行赋值并打印C老师语言老师补充的一个知识点
提问者采纳
string result_str,真的--------------------------------------------------------理论上.而动态分配数组时;Mary and Linda&quot,此内存空间称为程序的自由存储区(free store)或堆(heap);该语句回收了pia所指向的数组; return 0; &#47:a;/
释放pa所指向的数组空间;/performance test on string allocation and copyfor(int ix=0,++tp)
*tp=*iter,否则.const对象的动态数组如果我们在自由存储区中创建的数组存储了内置类型的const对象,已创建的常量元素不允许修改------因此这样的数组实际上用处不大;
/array of 10 empty stringsint *pia=new int[10];动态分配数组 strcpy(result_str,只需指定类型和数组长度,有可能会带来更严重的运行时错误,new表达式返回指向新分配数组的第一个元素的指针; delete[] result_str:int *pia2=new int[10]():const char *noerr=&在该指针上加(减)0,则仍然可以成功调用我们想在运行时把这两个字符串中的一个复制给新的字符数组;ok,该维数可以是任意的复杂表达式.我们可以编写如下代码size_t n=get_size(),在获得的字符串长度上必须加1以便在动态分配时预留结束符的存储空间;或元素类型;const size_t len=strlen(pc +1).push_back(ival).对于某些系统和&#47,所以for循环实际比较的是p和q;success&
&#47:数组长度固定不变:uninitialized const arrayconst int *pci_bad=new const int[100]?int *pa=new int[10];
/,程序员只能通过其地址间接地访问堆中的对象,在该循环的循环体中;C-style character string implementationconst char *pc=&quot.允许动态分配空数组之所以要动态分配数组,而q是用p初始化的!=ivec!&quot.size()]:cannot define zero-length arraychar *cp=new char[0],其元素只能初始化为元素类型的默认值.在关键字delete和指针之间的空方括号对是必不可少的; strcat(result_str,把结果存储在一个C风格字符串中:array of 100 empty stringsconst string *pcs=new const string[100],而使用string类型的程序由系统自动进行内存的分配和释放; size_t len=strlen(cp1)+strlen(cp2):delete[]&#47:它告诉编译器该指针指向的是自由存储区中的数组,cp1);/&#47.动态数组的定义数组变量通过指定类型;在这里; while(cin&&#47,但这些元素没有初始化;are firends&quot.----------------------------------------------------我依然是无辜的分割线---------------------------------------------3::创建一个新字符串.---------------------------------------------我很郁闷.在上述例题中;&#47,automatically allocated if(str:iterator iter=&#47.如果不再需要使用动态创建的数组;
&#47:int *pia=new int[10];/&#47,errorTxt,无法赋值.实现这个要求的唯一方法是对数组做值的初始化,并不包括字符串结束符.习题4;&#47.当然;&++iter:以下两段程序反映了使用C风格字符串与C++的标准库类型string的不同之处!=str2)
&#47,将使用string类的默认构造函数初始化数组元素://string implementationstring str(&quot,将导致程序在运行时出错?b?请说明原因;/char *errMsg=new char[dimension];;&#47,而并非单个对象.假设有以下C风格字符串,而且出错的可能性更小,执行速度也要快一点习题4;);vector&
&#47,用初始化列表为数组元素提供各不相同的初值,因此比使用C风格字符串的程序要简短,但明确指出,如果get_size返回0.2;
&#47,然后动态创建一个与vector对象大小一致的数组;do nothing}
/array of 10 ninitialized ints这两个new表达式都分配了含有10个对象的数组;a very long literal string&allocate the space strcpy(pc2;++q)/endl.1;如果数组元素是内置类型; char *result_str=new char[len+1];str2 is automatically freed---------------------------------------------------我是困倦的分割线------------------------------------------------------------6;连接两个string类型字符串#include&lt,则必须为这个数组提供初始化,但该类类型必须提供默认构造函数.每一个程序在执行时都占用一款可用的内存空间;iostream&..解释这两个程序实现什么功能;;把结果存储在一个C风格字符串中#include&复制元素 int *tp=pia,常常使用char*指针指向多个C风格字符串,调用new动态创建长度为0的数组是合法的,最后释放新字符串b;space to allocate/&#47,至少会导致运行时少释放了内存空间; return 0,然后创建和处理该数组;&#47,此返回值初始化了指针); result_str=str1;&#47.new表达式需要指定指针类型以及在方括号中给出的数组维数;#include&++ix){ char *pc2=new char[len+1]:but cp can'计算数组长度,因此该指针能在循环中使用;/int main(){ const char *cp1=&use the nuw string&#47,而不能像数组变量一样.因为n为0;读入元素数据并建立vector cout&lt,在释放动态数组时千万别忘了方括号对,但是p并没有指向任何对象,在程序执行过程中,并返回指向该数组第一个元素的指针;cstring&gt:string *psa=new string[10],dimension);&#47,这两个string类型字符串与前面C风格字符串字面值具有相同的内容;/ /ix.例如:对于动态分配的数组;t be dereferenced用new动态创建长度为0的数组时;);&#47.与数组变量不同;do the copy if(strcmp(pc2;&#47,如果get_size返回0会怎么样.27
假设有下面的new表达式;&
&quot,往往是由于编译时并不知道数组的长度;Error.begin(),在我们用了五年的PC机上其平均执行速度分别是;&/Mary and Linda&elseerrorTxt=noerr:比较运算;
&#47.使用C风格字符串的程序需要自己管理内存的分配和释放;释放动态数组的内存 delete[]&#47.-----------------------------------------------------我是无辜的分割线-----------------------------------------------注解;别忘记标准库函数strlen返回的是字符串的长度,回收数组时缺少空方括号对;
编写程序由从标准输入设备读入的元素数据建立一个int型vector对象:代码仍然正确执行,两者具有相等的值;int main(){ const string str1(&quot.第二个数组则具有内置类型的元素;string&gt.使用string类型的版本更短.;/
编写程序连接两个C风格字符串字面值:如果遗漏了空方括号对.a,得0值,然后比较两个字符串.动态数组的使用通常是因为在编译时无法知道数组的维数.----------------------------------------------我是郁闷的分割线----------------------------------------------------小心;&#47.47
# string classuser 2;;Enter numbers,把相应的内存返还给自由存储区.const char *err189=&quot.因此,cp2):/
&#47,new返回有效的非零指针.该指针与new返回的其他指针不同.C++语言为指针提供delete[]表达式释放指针所指向的数组空间,于是可以用以下程序在运行时计算维数,而C++语言则使用new和delete表达式实现相同的功能;&#47,在编译时必须知道其长度;delete[] pa.&#47.平均来说,所以才需要动态创建该数组,分配了存储10个int对象的内存空间; //&#47.也可使用跟在数组长度后面的一对空圆括号,因此for循环条件不成立:/;a very long literal string&quot,在本例中即把数组元素都设置为0;array of 10 uninitialized ints此new表达式分配了一个含有10个int型元素的数组,不能进行解引用操作、数组名和维数来定义,pc),把vector对象的所有元素复制给新数组;}习题4;
/&lt:执行一个循环次数为1000000的循环,请问如何释放pa.C++虽然不允许定义长度为0的数组变量,但动态分配的数组不必在编译时知道其长度,数组只在定义它的块语句内存在!=1000000;/copy the text for the error into errMsgstrncpy (errMsg:user 0;/从标准输入设备读入的元素元素数据建立一个int型vector对象/ for(vector&lt.初始化动态分配的数组动态分配数组时,使用string类型的程序执行速度要比用C风格字符串的快很多?答案是;动态创建数组 int *pia=new int[ivec:const char *errorTxt,将使用该类的默认构造函数实现初始化,就不必再担心因数组变量具有固定的长度而造成的溢出问题,这是一个编译器无法发现的错误;}/do nothing delete[] pc2;&#47,从而产生内存泄漏(memory leak): a function declaration must &&#47,于是必须根据每个字符串的长度实时地动态分配存储空间;get_size returns number of elements neededint *p=new int[n],则无初始化.&#47,因为它毕竟没有指向任何元素.end();if(errorFound)errorTxt=err189.而允许的操作包括;int main(){ vector&q.然后再编写程序连接两个string类型字符串.创建数组后; /&#47.29
对本小节第五条框中的两段程序;
&#47:因为数组元素都是const对象; const char *cp2=&;/remember the 1 for the terminating nullint dimension=strlen(errorTxt)+1!=p+n,&#47.有趣的是;&#47.C语言程序使用一对标准库函数malloc和free在自由存储区中分配存储空间; ivec.这两段程序的功能是,数组是空的.如果程序员能够准确计算出运行时需要的数组长度; const string str2(&quot.采用这种技术要比建立固定大小的数组安全;&#47.4,动态分配的数组将一直存在; &#47:value-initialized const arrayconst int *pci_ok=new const int[100]();连接两个C风格字符串字面值;ix.习题4;free the memory}&#47,将调用string类型的默认构造函数依次初始化数组中的每个元素;.实际的程序往往不能忍受这样的限制-------它们需要在运行时 动态地分配数组,将一个已存在的字符串复制给新字符串.虽然数组长度是固定的;performance test on string allocation and copyfor(size_t ix=0;C++允许定义类类型的const数组;++ix){ string str2=把vector对象的所有元素复制给新数组#include&lt,pc))
&#47.其中第一个数组是string类型,内存最终将会逐渐耗尽;use the new string
,不必为数组对象命名;&for(int *q=p;
&#47,或者减去本身值.55
# C-style character string你预计的也一样吗,程序员必须显式地将其占用的存储空间返还给程序的自由存储区./using namespace std,用于存放动态分配的对象,new将返回指向数组第一个元素的指针;
&#47,对数组元素做值初始化,分配了保存对象的内存空间后;/int&gt.在自由存储区中创建的数组对象是没有名字的;array of 10 uninitialized ints圆括号要求编译器对数组做值初始化,可以(通常也是)在运行时才确定数组长度;&#47:(Ctrl+Z to end)& result_str+=str2,知道程序显式释放它为止;然后动态创建一个与该vector对象大小一致的数组:char arr[0]、更容易理解,循环体一次都没有执行5;/&#47.动态空间的释放动态分配的内存最后必须进行释放.&quot.----------------------------------------------------------我是困倦的分割线-------------------------------------C风格字符串与C++的标准库类型string的比较;/ival) return 0创建动态数组 数组类型的变量有三个重要的限制;* process the array *&#47,如果数组元素具有类类型;specify a function return type
提问者评价
老大,这么大一片我勉强看了个大概,不过那个题目的解答在哪儿呢?不过还是谢谢了。如果能补上答案的话~
其他类似问题
为您推荐:
通俗易懂的相关知识
其他1条回答
大一学过 可惜我也忘得差不多了 帮不了你
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 char 字符串连接 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信