使用C++标准库如何实现CString::GetBuffer()的功能

zgysx 2011-08-04 10:33:24

有这样一个函数,GetModuleFileName( HANDLE hModule, char * psz, int nSize )获取本程序的全路径。

CString strPath;
GetModuleFileName( NULL, strPath.GetBuffer( MAX_PATH ), MAX_PATH );
strPath.ReleaseBuffer();

此时strPath就存储的就是本程序的全路径了。

请问在标准库中有没有哪个类返回非const char*的函数。我试过将string()::c_str()返回的const char *中的const去掉,结果还是不对。stringstream也试过,好像也没有返回char *的函数。

不要使用字符串数组
...全文
387 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgysx 2012-03-09
  • 打赏
  • 举报
回复
自己解决了。
std::string str;
str.resize( MAX_PATH );
int iLength = GetModuleFileName( NULL, &*(str.begin()), str.size() );
str.resize(iLength);
zgysx 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 akirya 的回复:]
引用 10 楼 zgysx 的回复:

引用 7 楼 akirya 的回复:
string 木有
用vector<char> 吧

vector<char> 是可以,我想知道stringstream可以不?或者还有没有更好的选择?

stringstream不行。。
[/Quote]
看来这还真是标准库的一个不足之处啊!
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zgysx 的回复:]

引用 7 楼 akirya 的回复:
string 木有
用vector<char> 吧

vector<char> 是可以,我想知道stringstream可以不?或者还有没有更好的选择?
[/Quote]
stringstream不行。。
zgysx 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 akirya 的回复:]
string 木有
用vector<char> 吧
[/Quote]
vector<char> 是可以,我想知道stringstream可以不?或者还有没有更好的选择?
jackyjkchen 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hai040 的回复:]

可变长的也不会在api里变
该越界的还是会越
[/Quote]
没错,就像GetBuffer需要长度参数一样,vector也得预先分配长度才能在API用,因此这个场景最适合的就是TCHAR数组
hai040 2011-08-04
  • 打赏
  • 举报
回复
可变长的也不会在api里变
该越界的还是会越
  • 打赏
  • 举报
回复
string 木有
用vector<char> 吧
jackyjkchen 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zgysx 的回复:]
GetModuleFileName()这个函数,是我举的一个例子,好多旧版的系统函数,返回一个字符串时都是通过字符数组来返回的,我不想使用字符数组,能不能用stringstream来办到,数组很容易越界。我是想问标准库中有没有返回非const char*的函数,我觉得stringstream应该有这样的功能,或者其它和它功能相近的类有这样的函数。


引用 2 楼 jackyjkchen 的……
[/Quote]

你用的VC6?考虑到日后新版本VC的兼容性,还是不要用STL的好,因为新版本VC全部默认unicode,所有存在字符串输入输出的API都只接受wchar_t!

越界问题不是那么难解决的,Windows不同于dos,内部异常机制强悍,任何写入的越界,至少debug版本都能给你报个错误对话框(xxx内存不能为write)或者在free/delete时报异常。

真要说的话。vector倒是符合你的需求,vector<TCHAR>就是TCHAR的可变长数组,而且TCHAR型避免的STL与API的风格不统一
zgysx 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jackyjkchen 的回复:]
我不推荐你用C++标准库和Windows API配合,二者风格相冲

windows api和CString风格统一,在Unicode下是wchar_t,Ansi下是char,标准库呢?

wstring和string你说用哪个?标准库没有能自动根据工程选项调整字符版本的类!
[/Quote]
难道只能被迫使用字符数组了。C++标准库没有提供解决的办法吗?
zgysx 2011-08-04
  • 打赏
  • 举报
回复
GetModuleFileName()这个函数,是我举的一个例子,好多旧版的系统函数,返回一个字符串时都是通过字符数组来返回的,我不想使用字符数组,能不能用stringstream来办到,数组很容易越界。我是想问标准库中有没有返回非const char*的函数,我觉得stringstream应该有这样的功能,或者其它和它功能相近的类有这样的函数。

[Quote=引用 2 楼 jackyjkchen 的回复:]
我不推荐你用C++标准库和Windows API配合,二者风格相冲

windows api和CString风格统一,在Unicode下是wchar_t,Ansi下是char,标准库呢?

wstring和string你说用哪个?标准库没有能自动根据工程选项调整字符版本的类!
[/Quote]
healer_kx 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jackyjkchen 的回复:]

仅仅是这种需求

TCHAR szPath[MAX_PATH]= {0};
GetModuleFileName( NULL, sszPath, MAX_PATH );

内置类型就能解决,何必那么麻烦,ATL/MFC的CString实现很糟糕,效率奇低,我尽量避免使用
[/Quote]

我都是这种写法。

另外我还是很喜欢用CString的,做客户端程序足够了。
jackyjkchen 2011-08-04
  • 打赏
  • 举报
回复
我不推荐你用C++标准库和Windows API配合,二者风格相冲

windows api和CString风格统一,在Unicode下是wchar_t,Ansi下是char,标准库呢?

wstring和string你说用哪个?标准库没有能自动根据工程选项调整字符版本的类!
jackyjkchen 2011-08-04
  • 打赏
  • 举报
回复
仅仅是这种需求

TCHAR szPath[MAX_PATH]= {0};
GetModuleFileName( NULL, sszPath, MAX_PATH );

内置类型就能解决,何必那么麻烦,ATL/MFC的CString实现很糟糕,效率奇低,我尽量避免使用
至善者善之敌 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 jackyjkchen 的回复:]
引用 13 楼 akirya 的回复:

引用 12 楼 zgysx 的回复:

引用 11 楼 akirya 的回复:
引用 10 楼 zgysx 的回复:

引用 7 楼 akirya 的回复:
string 木有
用vector<char> 吧

vector<char> 是可以,我想知道stringstream可以不?或者还有没有更好的选择?

stringstr……
[/Quote]


。。。。。。。。
zgysx 2011-08-04
  • 打赏
  • 举报
回复
在项目中有很多人喜欢用字符数组,看上数组好像不会越界,但是考虑到把字符更换成其它国家的语言时,就有可能出现字符数组越界。手动在堆上开辟内存有些麻烦。
zgysx 2011-08-04
  • 打赏
  • 举报
回复
呵呵,真是折杀我了[Quote=引用 13 楼 akirya 的回复:]
引用 12 楼 zgysx 的回复:

引用 11 楼 akirya 的回复:
引用 10 楼 zgysx 的回复:

引用 7 楼 akirya 的回复:
string 木有
用vector<char> 吧

vector<char> 是可以,我想知道stringstream可以不?或者还有没有更好的选择?

stringstream不行。。

看来这还真是标准库的一个……
[/Quote]
jackyjkchen 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 akirya 的回复:]

引用 12 楼 zgysx 的回复:

引用 11 楼 akirya 的回复:
引用 10 楼 zgysx 的回复:

引用 7 楼 akirya 的回复:
string 木有
用vector<char> 吧

vector<char> 是可以,我想知道stringstream可以不?或者还有没有更好的选择?

stringstream不行。。

看来这还真是标准库的一……
[/Quote]
确实,别的不说,在CSDN里GetBuffer之后还知道Release的,楼主是我见到的第一个……
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zgysx 的回复:]

引用 11 楼 akirya 的回复:
引用 10 楼 zgysx 的回复:

引用 7 楼 akirya 的回复:
string 木有
用vector<char> 吧

vector<char> 是可以,我想知道stringstream可以不?或者还有没有更好的选择?

stringstream不行。。

看来这还真是标准库的一个不足之处啊!
[/Quote]
什么不足啊CString.GetBuffer陷阱很深,出错几率更大。

64,676

社区成员

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

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