指针的奇怪问题:

rferen2003 2004-11-16 12:29:37

MyPointer.h
-------------------------------------------------------
#include <iostream>
#include <string>
using namespace std;

class MyPointer
{
public:
string ConvertAString(string s);

};

MyPointer.cpp
------------------------------------

#include "MyPointer.h"


//将一个字符串逆转过来
string MyPointer::ConvertAString(string s)
{
char *pStr=tempnam(s.c_str(),NULL);
char* temp=new char;
int count=s.size();
for(int i=0;i<s.size()/2;i++)
{
*(pStr+i)=*(pStr+count+i);
}

string ret(pStr);

return ret;

}

main.cpp
--------------------------------------------
#include <iostream>
#include <stdlib.h>
#include "MyPointer.h"

using namespace std;

int main(int argc, char *argv[])
{
MyPointer pointer;
string str=pointer.ConvertAString("thisisastring");
cout<<str;
system("PAUSE");
return 0;
}

我想将实现一个字符串的翻转操作,可是为什么输出结果是:

DMINI~UME~1\ADMINI~1\LOCALS~1\Temp\2
...全文
208 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Andy84920 2004-11-16
  • 打赏
  • 举报
回复
在我的系统上这个函数并不是string参数而是如下:

_CRTIMP char* __cdecl tempnam (const char*, const char*);
Andy84920 2004-11-16
  • 打赏
  • 举报
回复
先把数据COPY到另一个地方,再修改.像我上面做的那样.
rferen2003 2004-11-16
  • 打赏
  • 举报
回复
我知道了,这里用错了
char *pStr=tempnam(s.c_str(),NULL);
可是怎么样才能把string s转化成char *pStr那?
我用const char *pStr=s.c_str();就变成const字符串了,
再也不能修改它了.

怎么样才能把它变成一个可以修改的指针吗?
Andy84920 2004-11-16
  • 打赏
  • 举报
回复
string MyPointer::ConvertAString(string s)
{
char *pStr=tempnam(s.c_str(),NULL);
char* temp=new char[strlen(pStr)+1];
strcpy(temp,pStr);
int count=s.size();
for(int i=0;i<s.size()/2;i++)
{
*(temp+i)=*(temp+count+i);
}
string ret(pStr);
delete [] temp;
return ret;

}
最好改成这样,你的类有什么用我不知道.:)你这里的类根本就没意义的.
你的main中的传给函数的参数也没意义...
Andy84920 2004-11-16
  • 打赏
  • 举报
回复
string tempnam(string dir, string prefix);
函数说明 在指定目录下创建一个唯一的文件名。如果目录不存在,函数会在系统的临时目录下生成一个文件名。tempnam()函数的行为取决与操作系统。在Windows下,TMP环境变量将覆盖dir参数;在Linux中,优先使用TMPDIR环境变量;而对SVR4系统,如果dir参数所指向的目录存在,总是使用dir参数作为目录。
Andy84920 2004-11-16
  • 打赏
  • 举报
回复
char *tempnam(const char *dir, const char *pfx);
这个函数你知道是干什么的吗?
oyljerry 2004-11-16
  • 打赏
  • 举报
回复
用指针,
然后传递的时候,用堆
rferen2003 2004-11-16
  • 打赏
  • 举报
回复
帮帮忙阿,不然我就完蛋了
rferen2003 2004-11-16
  • 打赏
  • 举报
回复
const char pStr[]=s.c_str();根本编译不过去


改成这样:
//将一个字符串逆转过来
string MyPointer::ConvertAString(string s)
{
const char *pStr=s.c_str();
char* temp=new char[sizeof(s)];
strcpy(temp,pStr);
int count=s.size();
for(int i=0;i<s.size()/2;i++)
{
char c;
c=*(temp+i);
*(temp+i)=*(temp+count-i);
*(temp+count-i)=c;
}


string ret(temp);
delete [] temp;

return ret;

}


输出结果还是空字符串,这到底是为什么啊
zyk7069 2004-11-16
  • 打赏
  • 举报
回复
可以这样改:
//将一个字符串逆转过来
string MyPointer::ConvertAString(string s)
{
const char pStr[]=s.c_str();
char* temp=new char[strlen(pStr)+1];
strcpy(temp,pStr);
int count=s.size();
for(int i=0;i<s.size()/2;i++)
{
*(temp+i)=*(temp+count-i);
}


string ret(temp);
delete [] temp;

return ret;

}
zyk7069 2004-11-16
  • 打赏
  • 举报
回复
Andy84920(你也不懂) ,你也有一个地方错了,即strlen(pStr)+1,pStr是一个指针,而不是数组名,它最多占四个字节,因此用它你得不到数组的长度。
rferen2003 2004-11-16
  • 打赏
  • 举报
回复
顶一下,很急啊
rferen2003 2004-11-16
  • 打赏
  • 举报
回复
//将一个字符串逆转过来
string MyPointer::ConvertAString(string s)
{
const char *pStr=s.c_str();
char* temp=new char[strlen(pStr)+1];
strcpy(temp,pStr);
int count=s.size();
for(int i=0;i<s.size()/2;i++)
{
*(temp+i)=*(temp+count-i);
}


string ret(temp);
delete [] temp;

return ret;

}

这样改了以后,为什么输出的是空字符串?

64,691

社区成员

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

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