VC2005,狗血的CString::MakeLower()出错

kenshu 2011-04-21 06:12:16
vc2005 + win2000.//VC6下没有问题

实际运行时提示 "An invalid argument was encountered.",我查了两天多.

哪位能帮测试一下,看看是什么问题.

谢谢!


代码在下面链接中.//我只把出错的抽出来.

http://www.shuct.net/down.asp?id=20110421180927&check=E40C8C483358CCE01517322E61E825FC


......
CString ls_swap;

theApp.loadfile("1111.txt",&ls_swap);

MessageBox(NULL,ls_swap,"",NULL);//到这里没问题
ls_swap.MakeLower();//这一句出错
MessageBox(NULL,ls_swap,"",NULL);
......

---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
Runtime Error!

Program: f:\desktop\...



This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.


---------------------------
确定
---------------------------
......
...全文
1108 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
Samesky001 2011-04-25
  • 打赏
  • 举报
回复
将工程属性里的字符集 改成“未设置”,然后再试下
kenshu 2011-04-23
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 z888c 的回复:]
仔细看看文档吧,好好研究GetBuffer, ReleaseBuffer!!!!!!CAI
[/Quote]

我的代码中没有用到GetBuffer, ReleaseBuffer,具体的问题,烦参见9楼.

谢谢!
z888c 2011-04-23
  • 打赏
  • 举报
回复
仔细看看文档吧,好好研究GetBuffer, ReleaseBuffer!!!!!!CAI
真相重于对错 2011-04-22
  • 打赏
  • 举报
回复
呵呵,不仅上面的错误,文件也有问题
muzizongheng 2011-04-22
  • 打赏
  • 举报
回复
狗血的ML。。。。
kenshu 2011-04-22
  • 打赏
  • 举报
回复
谢谢各位.分数很少,将就着给分.

谢谢!
真相重于对错 2011-04-21
  • 打赏
  • 举报
回复
机子没有图像处理软件,只能把屏幕直接全考下来,凑合看吧
*as_body=*as_body+lc 改变了as_body 所封装的char* 或者是 wchar*,离开作用域后,as_body 也就是ls_swap 里面的值无效对他makelower
不错才怪
看看cwnd::getwindowText(Cstring&) 如何写的??

void CWnd::GetWindowText(CString& rString) const
{
ASSERT(::IsWindow(m_hWnd));

#ifndef _AFX_NO_OCC_SUPPORT
if (m_pCtrlSite == NULL)
{
#endif
int nLen = ::GetWindowTextLength(m_hWnd);
::GetWindowText(m_hWnd, rString.GetBufferSetLength(nLen), nLen+1);
rString.ReleaseBuffer();

#ifndef _AFX_NO_OCC_SUPPORT
}
else
{
m_pCtrlSite->GetWindowText(rString);
}
#endif
}
真相重于对错 2011-04-21
  • 打赏
  • 举报
回复
kenshu 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 visualeleven 的回复:]
theApp.loadfile("1111.txt",&ls_swap);
你的loadfile里怎么实现的?
[/Quote]

它只是把 1111.txt的内容读到 ls_swap中,相信和出错没有关系.您也可以另外写一个读取1111.txt的函数.

谢谢!
Eleven 2011-04-21
  • 打赏
  • 举报
回复
theApp.loadfile("1111.txt",&ls_swap);
你的loadfile里怎么实现的?
kenshu 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 hdt 的回复:]
应该跟字符没有太大关系
是你错误的把cstring 当做 char来操作的问题
你在loadfile中破坏了ls_swap 它所封装的 字符串 指针,
[/Quote]

不是的,应该是9楼的原因.

loadfile是随手写的,跟这个错误没有关系//为的是大家看我程序的时候,可以直接读主要的地方.不用再去写一个函数读入那个字符串.
真相重于对错 2011-04-21
  • 打赏
  • 举报
回复
应该跟字符没有太大关系
是你错误的把cstring 当做 char来操作的问题
你在loadfile中破坏了ls_swap 它所封装的 字符串 指针,

kenshu 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 starsunyzl 的回复:]
貌似跟设置的/默认的Locale、CodePage等有关,另外MakeLower在多线程下也容易异常,传说是微软故意这样设计的,建议别纠结这个了问题,还是老实用API吧:


C/C++ code
CharLower(ls_swap);
[/Quote]

那个文件长度是2294,用CharLower后,是2293......我是不是只能自己重新写一个MakeLower?

谢谢!
TandyT 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 kenshu 的回复:]
谢9/10楼,我试试//程序是从VC6转过来的,30几M的CPP程序,可能要改死人.VC6一定没有这个问题。

谢谢!

有没有人有别的办法,比如打个VC的补丁之类的。

谢谢!
[/Quote]

呵呵,实在不行,只能慢慢改咯
kenshu 2011-04-21
  • 打赏
  • 举报
回复
谢9/10楼,我试试//程序是从VC6转过来的,30几M的CPP程序,可能要改死人.VC6一定没有这个问题。

谢谢!

有没有人有别的办法,比如打个VC的补丁之类的。

谢谢!
kenshu 2011-04-21
  • 打赏
  • 举报
回复
回8楼,应该是这个原因.但有没有办法解决(程序需要做大量的文件处理,我无法先行去掉一些特殊的字符)?//我用VC6没有问题。


是否应该打什么补丁.
kenshu 2011-04-21
  • 打赏
  • 举报
回复
回5/6楼,我试了一下(VC2005+WIN2000)

CFile _file;
if(!_file.Open((LPCTSTR)"1111.txt",CFile::modeRead))
{
AfxMessageBox((LPCTSTR)"打开文件失败!");
return false;
}

//文件长度;
int _len = (long)_file.GetLength();
//已经处理的长度
int _lendone=0;
int testprocess=0;
char* pdata = new char[_len+1];
char *strtem=new char[256];
//-----------------------------------------=
//读文件;
_file.Read(pdata,_len);
pdata[_len] = 0;
_file.Close();
CString str;//这个是我加上来的,您原来的代码中没有

str.Format("%s",pdata);
MessageBox(NULL,str,"原始的1111.TXT",MB_ICONEXCLAMATION);//正常
str.MakeLower();
MessageBox(NULL,str,"测试MakeLower",MB_ICONEXCLAMATION);//正常
str.MakeUpper();
MessageBox(NULL,str,"测试MakeUpper",MB_ICONEXCLAMATION);//正常


return false;

还是会
StarsunYzL 2011-04-21
  • 打赏
  • 举报
回复
貌似跟设置的/默认的Locale、CodePage等有关,另外MakeLower在多线程下也容易异常,传说是微软故意这样设计的,建议别纠结这个了问题,还是老实用API吧:

CharLower(ls_swap);
King_hhuang 2011-04-21
  • 打赏
  • 举报
回复
原因出在你的第1728个字符,它的值是-87

你试试下面的代码,就会得到跟你一样的错误
CString str;
str += (char)-87;
str.MakeLower();

CString 中含有负数的话,MakeLower就会抛出异常
  • 打赏
  • 举报
回复
有个字符

Copyright ?1996-1997

这里的?是一个无效的字符。。。对应ascii是 A9
去掉就正确了
加载更多回复(7)

16,548

社区成员

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

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

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