几行的诡异的程序,各位帮我看看是不是我哪个地方没考虑得到?

秀小川 2012-08-28 03:35:12

strPath = CGlobal::m_BackupAddress;
strPath += strTime;


strPath = "C:\\Backup\\";
strPath += strTime;

如上两段代码,第一段中CGlobal::m_BackupAddress也是CString型的,我单步到strPath = CGlobal::m_BackupAddress时 strPath在监视窗里面看到的内容是"C:\Backup",继续单步一步,加上strTime之后,strPath居然等于strTime了!第二段代码能够正常运行!!!
尝试了几次都不行,而且第一段中我还把strPath赋值给一个strTemp,然后让strTemp+= strTime,居然strTemp也等于strTime了!太诡异了!
...全文
173 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
秀小川 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]
引用 17 楼 的回复:
我大概试出来在哪出问题了,我在程序初始化的时候用::GetPrivateProfileString函数从我……


个人估计是你用GetPrivateProfileString函数用的有问题,导致栈上的数据出错...
例如
Assembly code

GetPrivateProfileString("Student","Name","DefaultNam……
[/Quote]
就是这样,谢谢怪龙兄了! 做MFC不久,经常不知道要release!
schlafenhamster 2012-08-30
  • 打赏
  • 举报
回复
记住 strTemp.GetBuffer一定要Release
dickbarry 2012-08-30
  • 打赏
  • 举报
回复
注意:在这里使用CString变量时,在使用完GetBuffer后,紧接着一定要使用ReleaseBuffer()函数,才可以进行其他的诸如字符串+操作
dickbarry 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]
我大概试出来在哪出问题了,我在程序初始化的时候用::GetPrivateProfileString函数从我……
[/Quote]

个人估计是你用GetPrivateProfileString函数用的有问题,导致栈上的数据出错...
例如

GetPrivateProfileString("Student","Name","DefaultName",SName.GetBuffer(MAX_LENGTH),MAX_LENGTH,"c:\\setting.ini");

结果:SName = "jacky";这里需要注意点就是用完GetBuffer函数后一定要释放(用SName.ReleaseBuffer()函数),不然后面再用到SName的其他子函数就会失灵。


秀小川 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

DWORD GetPrivateProfileString(
LPCTSTR lpAppName, // points to section name
LPCTSTR lpKeyName, // points to key name
LPCTSTR lpDefault, // points to default string
LP……
[/Quote]
原来是const的问题,我知道const的值是不可修该的.那const的值还是不可进行运算的吗?

::GetPrivateProfileString("Backup","time","",strTemp.GetBuffer(50),50,".//test.ini");
CString s1,s2;
s1 = "111";
s2 =strTemp+s1;

这段代码最后为什么s2还是"111"?
赵4老师 2012-08-30
  • 打赏
  • 举报
回复
DWORD GetPrivateProfileString(
LPCTSTR lpAppName, // points to section name
LPCTSTR lpKeyName, // points to key name
LPCTSTR lpDefault, // points to default string
LPTSTR lpReturnedString, // points to destination buffer
DWORD nSize, // size of destination buffer
LPCTSTR lpFileName // points to initialization filename
);

File: "C:\Program Files\Microsoft Visual Studio\VC98\Include\WINNT.H" 2 occurrences found on 2 lines
182: typedef LPCWSTR LPCTSTR;
196: typedef LPCSTR LPCTSTR;
File: "C:\Program Files\Microsoft Visual Studio\VC98\Include\WTYPES.H" 1 occurrences found on 1 lines
209: typedef /* [string] */ const CHAR __RPC_FAR *LPCSTR;
秀小川 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

CGloabl
{
public:
static CString m_BackupAddress;
}
//
m_BackupAddress;在那里赋值?
[/Quote]
我大概试出来在哪出问题了,我在程序初始化的时候用::GetPrivateProfileString函数从我的ini文件里面读出来的值! 我猜问题应该是在这里,具体怎么解决我还不知道!
我发现用::GetPrivateProfileString读出来的值,貌似不能进行一部分操作! 不知道是不是!!
schlafenhamster 2012-08-29
  • 打赏
  • 举报
回复
CGloabl
{
public:
static CString m_BackupAddress;
}
//
m_BackupAddress;在那里赋值?
秀小川 2012-08-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

static 的意思是声明局部静态变量,静态变量和普通变量的存储位置不同,你将一个
静态变量赋值给一个普通变量只是暂时改变了普通变量的值,在下一次赋值时,因为存储
位置不同所以值被重新覆盖了。
[/Quote]

class CTest
{
public:
static int a;
};
int CTest::a = 1;
void main()
{
int b(0),c(1);
b = CTest::a;
b += c;
cout<<b<<endl;
}

按照你这个说法的话,这段代码是不是应该输出1? 但是我看到输出的是2!!!
康斯坦汀 2012-08-29
  • 打赏
  • 举报
回复
static 的意思是声明局部静态变量,静态变量和普通变量的存储位置不同,你将一个
静态变量赋值给一个普通变量只是暂时改变了普通变量的值,在下一次赋值时,因为存储
位置不同所以值被重新覆盖了。
秀小川 2012-08-29
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用楼主 的回复:
C/C++ code

strPath = CGlobal::m_BackupAddress;
strPath += strTime;


C/C++ code

strPath = "C:\\Backup\\";
strPath += strTime;


如上两段代码,第一段中CGlobal::m_BackupAddress也是CString型……
[/Quote]
这样的确可行! 就是为什么直接"+"不行? 因为是static的吗?
Eleven 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
C/C++ code

strPath = CGlobal::m_BackupAddress;
strPath += strTime;


C/C++ code

strPath = "C:\\Backup\\";
strPath += strTime;


如上两段代码,第一段中CGlobal::m_BackupAddress也是CString型的,我单步到strPath = CGlob……
[/Quote]
要是我一般就这样写
strPath.Format(_T("%s%s"), CGlobal::m_BackupAddress, strTime);
AfxMessageBox(strPath);
hztj2005 2012-08-28
  • 打赏
  • 举报
回复
看一看响应的汇编代码。
秀小川 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

你把程序重新生成一下
[/Quote]
清除 重建了几次了!
Barcode 2012-08-28
  • 打赏
  • 举报
回复
你把程序重新生成一下
秀小川 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

strPath在监视窗里面看到的内容是"C:\Backup"

不是应该是

strPath在监视窗里面看到的内容是"C:\Backup\"
[/Quote]
监视窗里面是"C:\Backup\",我刚刚打错了!
秀小川 2012-08-28
  • 打赏
  • 举报
回复

CGloabl
{
public:
static CString m_BackupAddress;
}

这是我m_BackupAddress的定义,不会有问题吧?
傻X 2012-08-28
  • 打赏
  • 举报
回复
strPath在监视窗里面看到的内容是"C:\Backup"

不是应该是

strPath在监视窗里面看到的内容是"C:\Backup\"
秀小川 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

用函数lstrcat试下。
[/Quote]
而且用lstrcat得到的新的strPath 如果再直接用"+"去连接别的字符串,结果strPath还是加不进去!!!!!
秀小川 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

用函数lstrcat试下。
[/Quote]
这个的确可行,可是我现在还想知道我这段代码有什么问题!!!
加载更多回复(3)

16,472

社区成员

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

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

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