高手帮忙看看,这个字符串的函数有什么问题,马上给分?

verapan 2003-09-29 11:55:48
一个VC下的函数

void strF(CString str, float f)
{
str.Format("%s%f", (LPCTSTR)str, f);
//AfxMessageBox(str);
}

这样调用这个函数会不会有问题呢?

strF(CString(_T("Hello")), 10.0);
...全文
34 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluebohe 2003-09-30
  • 打赏
  • 举报
回复
临时对象越界吧
楼上说得没错
BigF 2003-09-30
  • 打赏
  • 举报
回复
楼上说的是用类做参数没有效率, 但效率低和出错是两回事啊
ringphone 2003-09-30
  • 打赏
  • 举报
回复
函数参数最好不要用类,而用类指针或引用。
strF(CString(_T("Hello")), 10.0);
这样会先构造CString(_T("Hello")),因为是以值传递,会以生成的这个临时对象来调用CString的复制构造函数(CString::CString(CString&))进行初始化,最后还要析构,这么一个函数调用就执行了CString::CString(LPCTSTR)和CString::CString(CString&),以及两次~CString。
verapan 2003-09-30
  • 打赏
  • 举报
回复
可我在调试的时候有时会报错, 大家再帮忙看看!!
lostgdi731 2003-09-30
  • 打赏
  • 举报
回复
strF("Hello",10.0);
就可以了,没问题.
verapan 2003-09-30
  • 打赏
  • 举报
回复
Zark(金陵五月)
bluebohe(薄荷) ( )

能不能再说清楚点啊, 还是有点不懂

void strF(CString str, float f)
{
str.Format("%s%f", (LPCTSTR)str, f);
//AfxMessageBox(str);
}

中应该会建立一个临时对象吧, 那临时对象越界是怎么回事啊, 字符串临时对象不能改变大小吗?

谢谢
wy2001wy 2003-09-30
  • 打赏
  • 举报
回复
直接这样就可以了吧:
strF(_T("Hello"), 10.0);
booklove 2003-09-30
  • 打赏
  • 举报
回复
Format函数的参数里不能有变量自己。
verapan 2003-09-30
  • 打赏
  • 举报
回复
你的解法看不懂

你说:

void strF(CString str, float f)
{
CString another;
another.Format("%s%f",str,f);
m_strVector.push_back(another);
}

上面那么做好像没错了
>>
错。
CString another; 是 栈对象。函数栈析构后,变量值随机。

push_back()应该是存储变量的一个副本吧, 也就是调用拷贝构造函数, 应该没有问题的
Zark 2003-09-30
  • 打赏
  • 举报
回复
这个函数
void strF(CString str, float f)
{
str.Format("%s%f", (LPCTSTR)str, f);
//AfxMessageBox(str);
}
有问题,str的字符缓冲区将会被破坏.

应该是
void strF(CString str, float f)
{
CString another;
another.Format("%s%f",(LPCTSTR)str,f);
//AfxMessageBox(another);
}

HongHuer 2003-09-30
  • 打赏
  • 举报
回复
1
void strF(CString str, float f)
{
CString another;
another.Format("%s%f",str,f);
m_strVector.push_back(another);
}

上面那么做好像没错了
>>
错。
CString another; 是 栈对象。函数栈析构后,变量值随机。


2
但我原先的做法到底错在哪里呢?
void strF(CString str, float f)
{
str.Format("%s%f",(LPCTSTR)str,f);
m_strVector.push_back(str);
}

是因为用str格式化自己吗

>>
是啊,是自己格式化自己。


3
我有个解法,你看看。

void strF(CString str, float f)
{
str.Format("%f",f);
m_strVector.push_back(another);
}

以后的不变。
你自己调看看。
lmopq 2003-09-30
  • 打赏
  • 举报
回复
这是MSDN的原话

The call will fail if the string object itself is offered as a parameter to Format. For example, the following code:

CString str = "Some Data";
str.Format("%s%d", str, 123); // Attention: str is also used in the parameter list.

will cause unpredictable results.

虽然你做了(LPCTSTR)str转换,但使用的依然是str。想知道清楚还是自己查查
operator LPCTSTR ( ) const和Format的源代码吧

verapan 2003-09-30
  • 打赏
  • 举报
回复
我先定义了一个字符串向量vector<CString> m_strVector;
然后往向量里面加入字符串,加入前想先调整一下格式,所以用这样一个函数先将字符串格式化,然后加入到向量中去

也就是:
vector<CString> m_strVector;

void strF(CString str, float f)
{
CString another;
another.Format("%s%f",str,f);
m_strVector.push_back(another);
}

上面那么做好像没错了

但我原先的做法到底错在哪里呢?
void strF(CString str, float f)
{
str.Format("%s%f",(LPCTSTR)str,f);
m_strVector.push_back(str);
}

是因为用str格式化自己吗
wuxfBrave 2003-09-30
  • 打赏
  • 举报
回复
(LPCTSTR)str还是对str的操作
HongHuer 2003-09-30
  • 打赏
  • 举报
回复
楼主,你想要干什么???


你的函数要完成什么样的功能?????
wuxfBrave 2003-09-30
  • 打赏
  • 举报
回复
void strF(CString str, float f)
{
str.Format("%s%f", (LPCTSTR)str, f);
//AfxMessageBox(str);
}
strF(CString(_T("Hello")), 10.0);

有问题,问题是你用str去format自己
HongHuer 2003-09-30
  • 打赏
  • 举报
回复
void strF(CString str, float f)
{
CString another;//----------------------这是个栈对象,你怎么传出去???
another.Format("%s%f",(LPCTSTR)str,f);
//AfxMessageBox(another);
}
HongHuer 2003-09-30
  • 打赏
  • 举报
回复
void strF(CString str, float f)
{
str.Format("%s%f", (LPCTSTR)str, f);
//AfxMessageBox(str);
}

这样调用这个函数会不会有问题呢?----------没有问题

strF(CString(_T("Hello")), 10.0); -------有个临时无名CString对象,
------但是你怎么使用这个无名的对象呢?

Paris_Luo 2003-09-30
  • 打赏
  • 举报
回复
这个函数
void strF(CString str, float f)
{
str.Format("%s%f", (LPCTSTR)str, f);
//AfxMessageBox(str);
}
有问题,str的字符缓冲区将会被破坏.

应该是
void strF(CString str, float f)
{
CString another;
another.Format("%s%f",(LPCTSTR)str,f);
//AfxMessageBox(another);
}

fingerfox 2003-09-30
  • 打赏
  • 举报
回复
str.Format
first release the buffer
seconde realloc the buffer
so the error occur
加载更多回复(5)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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