请各位给这个程序的解释

ly309431053 2009-04-18 11:50:30
#include <iostream>
using namespace std;
char * ab(char *);
int main()
{
char a[100];
cin>>a;
char *e=ab(a);
cout <<e <<endl
; 这种输入输出为什么对啊?给个解释吧谢谢
delete e;
system("pause");
return 0;
}
char* ab(char *a)
{
char *d=new char[strlen(a)+1];
int n=0,m=0;
while (1)
{
if(a[n] <='9'&&a[n]>='0')
{
n++;
continue;
}
d[m]=a[n];
if(a[n]=='\0')
{
d[m]=a[n];
break;
}
n++,m++;
}
return d;
}
...全文
175 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ttklboy 2009-04-20
  • 打赏
  • 举报
回复
呃 楼上的很好好像都没怎么仔细看问题  楼主问的是为什么cout一个指针没有错误 这是因为<<运算符重载的实现的
wllenyj 2009-04-20
  • 打赏
  • 举报
回复
e是指针啊,数组好像也能吧,C里面不是把数组名直接看成指针的么
wllenyj 2009-04-20
  • 打赏
  • 举报
回复
呵呵,现丑了
xuxinmmy 2009-04-19
  • 打赏
  • 举报
回复

a[100]初始化是一个问题,逻辑上你的循环还可能会有越界访问
虽然cin可能会自动帮你最多取99个字符然后加上个结束符(我没试过,你自己可以试下),
但最好不要依赖它,要自己显式的增加结束符,标记循环结束条件和一些状态
另外d也要初始化,不然输出还不对,记得所有变量定义申请时都应该初始化一下,最好养成习惯


#include <iostream>
using namespace std;
char * ab(char *);
int main()
{
char a[100] = {0}; //初始化
cin>>a;
char *e=ab(a);
cout<<e<<endl; 这种输入输出为什么对啊?给个解释吧谢谢
delete e; //这边是否应该用delete[] e呢
system("pause");
return 0;
}

char* ab(char *a)
{
int iLen = strlen(a);
char *d=new char[iLen+1];
memset(d, 0, iLen+1);//初始化d
int n=0,m=0;
while (n < iLen)//防止越界
{
if(a[n] <='9' && a[n]>='0')
{
n++;
continue;
}

d[m]=a[n];

//while条件已经保证不越界了,下面的if就不用了
//if(a[n]=='\0')
//{
// d[m]=a[n];
// break;
//}

n++,m++;
}

return d;
}

elated 2009-04-19
  • 打赏
  • 举报
回复
为什么不对呢?
标准库中重载了流操做符<<和>>,使它能以C++所有的内建型别作为参数,包括bool,void*,char*等等。
要想知道详细的看看《C++标准程序库》
HelloDan 2009-04-19
  • 打赏
  • 举报
回复
其实只要不越界就没有什么事的了。我其实不明白你要问什么。
shewolfbfh 2009-04-19
  • 打赏
  • 举报
回复
e指向的是字符数组,类似于char e[]="内容",用cout<<e输出的是数组的内容,而不是数组的首地址。
如果需要输出数组首地址,就这样cout<<(void*)e
HelloDan 2009-04-19
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;
char * ab(char *);
int main()
{
char a[100];
memset(a,0,100); ///here
cin>>a;
char *e=ab(a);
cout <<e <<endl; //这种输入输出为什么对啊?给个解释吧谢谢
delete e;
system("pause");
return 0;
}
char* ab(char *a)
{
char *d=new char[strlen(a)+1];
int n=0,m=0;
while (1)
{
if(a[n] <='9'&&a[n]>='0')
{
n++;
continue;
}
d[m]=a[n];
if(a[n]=='\0')
{
//d[m]=a[n];
break;
}
n++,m++;
}
return d;
}


wllenyj 2009-04-19
  • 打赏
  • 举报
回复
不知道你说的哪不理解呢???
char[]最后以'/0'为结束符你知道吧,所以在输入的时候a算作指针,直到你输入回车('/0')算是输入结束。
输出一个道理
zgjxwl 2009-04-19
  • 打赏
  • 举报
回复
那是个历史遗留问题。。为了兼容C代码吧。所以不用加*号。。。字符串里经常会这样用了。
ChenDon 2009-04-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 elated 的回复:]
为什么不对呢?
标准库中重载了流操做符 < <和>>,使它能以C++所有的内建型别作为参数,包括bool,void*,char*等等。
要想知道详细的看看《C++标准程序库》
[/Quote]

系统会根据找到首地址,按char类型的长度进行位移,逐个输出。如果要输出第一个字符可用cout << *e;
ly309431053 2009-04-19
  • 打赏
  • 举报
回复
能对数组直接输入输出吗?我问的就是这个问题的!
na2650945 2009-04-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xuxinmmy 的回复:]

a[100]初始化是一个问题,逻辑上你的循环还可能会有越界访问
虽然cin可能会自动帮你最多取99个字符然后加上个结束符(我没试过,你自己可以试下),
但最好不要依赖它,要自己显式的增加结束符,标记循环结束条件和一些状态
另外d也要初始化,不然输出还不对,记得所有变量定义申请时都应该初始化一下,最好养成习惯


#include <iostream>
using namespace std;
char * ab(char *);
int main()
{
char …
[/Quote]
正解。
freestyIe 2009-04-19
  • 打赏
  • 举报
回复
老大啊,这是C++中的 标准输入与输出对象 cin cout
cheng_fengming 2009-04-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wllenyj 的回复:]
不知道你说的哪不理解呢???
char[]最后以'/0'为结束符你知道吧,所以在输入的时候a算作指针,直到你输入回车('/0')算是输入结束。
输出一个道理
[/Quote]


应该是'\0'吧? 呵呵
zhaohongbo83 2009-04-19
  • 打赏
  • 举报
回复
不知道LZ什么意思,看到LS各位的解释

你那种输出是没有问题的。

aaaa3105563 2009-04-19
  • 打赏
  • 举报
回复
顶·
jackyjkchen 2009-04-18
  • 打赏
  • 举报
回复
你把 a[100]初始化一下,char a[100]={0}

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧