作者sean72 (.)
站内Programming
标题[问题] return pointer
时间Tue Feb 22 13:44:29 2011
我做了一个funtion回传值是pointer 的练习:
输入 abc 字串到 toUpper() 之後会印出 ABC
我想在toUpper()里面做完转换之後
不是回传字串ABC 而是回传字串的位址给 main()
main()可以从回传的位址找到转换後的字串ABC 并且印出
我先贴上我三个错误的想法以及问题 文章最後有正确解答
有高手能帮我看一下
回答一下我的盲点吗? 感谢
===================
1.
function.c: In function ‘char* toUpper(char*)’:
function.c:25: warning: address of local variable ‘bbb’ returned
我设了一个bbb矩阵在toUpper()里面暂时存放main()下来的字串
然後传回bbb (因为按照之前我看的内容 矩阵第一个元素等同於位址)
所以回传的bbb是位址没错吧
编译结果有一个warning 输出结果为乱码
char *toUpper(char *ptr){
int len;
int i=0;
len = strlen(ptr);
char bbb[len];
for(i=0;i<len;i++){
bbb[i]=toupper(*(ptr+i));
}
return bbb;
}
===================
2.
因为1.的错误 所以我再toUpper()里面又设了一个char *newStr变数
一样把bbb当作暂存器并且转换後存在bbb里面
最後再把 newStr=bbb
输出结果一样为乱码
char *toUpper(char *ptr){
int len;
int i=0;
len = strlen(ptr);
char bbb[len];
char *newStr;
for(i=0;i<len;i++){
bbb[i]=toupper(*(ptr+i));
}
newStr=bbb;
return newStr;
}
======================
3.
因为2.
我以为是不是因为没有让newStr知道我的字串长度所以电脑不知道要安排多少记忆体
所以我稍微改成char *newStr=new char[len];
一样输出乱码
char *toUpper(char *ptr){
int len;
int i=0;
len = strlen(ptr);
char bbb[len];
char *newStr=new char[len];
for(i=0;i<len;i++){
bbb[i]=toupper(*(ptr+i));
}
newStr=bbb;
return newStr;
}
===================
正解
#include <iostream>
#include <cstring>
#include <cctype>
using namespace std;
char *toUpper(char *);
int main (){
char aaa[]={"happy birthday"};
char *r;
int i;
r = toUpper(aaa);
cout << "UPPERCASE = " << r <<endl;
}
char *toUpper(char *ptr){
int len;
int i=0;
len = strlen(ptr);
char *newStr=new char[len];
for(i=0;i<len;i++){
*(newStr+i)=toupper(*(ptr+i));
}
return newStr;
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 69.205.68.125
1F:→ james732:前两个问题可见C_and_CPP置底十诫之五 140.117.171.46 02/22 14:39
2F:→ james732:其实三个问题都是一样的.... 140.117.171.46 02/22 14:41
3F:→ james732:另外最後的正解其实有memory leak问题 140.117.171.46 02/22 14:43