C++如何输入不确定长度字符串数组,以下代码中a只有一个存储空间,为什么没有编译错误而且输出完全正确。

本人使用.NET 2010编译器

#include "stdafx.h"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
char *a=new char; /此处a的存储空间大小已经确定了吗?
cin>>a;
int mNum=0;
for(int i=0;a[i]!='\0';i++)
mNum++;
for(int i=mNum;i>0;i--)
cout<<a[i-1];
cout<<endl;

system("PAUSE");
return 0;
}

c/c++语言的设计初衷之一,就是尽量相信程序员,而不是给程序员太多的限制

所以哪怕就算是你的操作看上去有了明显的错误(例如数组越界),也会编译通过

所以说cin只看到a是char*类型,但是cin不负责检查到底a是指向多少位char

不确定长度也可以用标准库<string>头文件下面的string类型,c++建议用这个类型代替c风格字符串char*追问

如果数组越界的话,运行过程中会发生访问错误吧~

追答

有可能,也有可能不会……具体看编译器是怎么处理,也看程序是怎么样,要看越界的地方是否重要之类的各种原因都可能

静态分配是指char *p=new char[10];吗?

静态分配一般是指局部变量的 char p[10];

追问

那如何用string 来输入不确定长度字符串呢?

追答

#include
using namespace std;

string str;
cin>>str;//这样输入会用空格和回车隔断字符串,例如输入abc edf回车,这里str就变成abc,因为abc后面有空格

getline(cin,str);//不用空格隔断字符串,而是输入一行,例如输入abc edf回车,这里str就变成"abc edf"

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-19
char *a只是分配了一个指针,是字符类型的指针。
最后长度是没有确定的。但是如果输入的字符长度过长,发生溢出,很容易导致一些错误。这一点非常不安全,所以现在的一些高级语言例如java、C#都把C++里面的指针给去掉了。
第2个回答  2011-12-19
不知LZ可曾听过动态内存分配,动态内存分配不用声明空间大小,只管申请空间就好了,因为动态分配是在执行阶段发生的而静态分配是在编译阶段发生的,所以后者得声明空间大小而前者不用,但是请记住这样用虽然方便,但是要记住,分配的动态空间用完以后得用delete关键字手动释放,不然会造成内存泄漏哦亲追问

静态分配是指char *p=new char[10];吗?

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网