wsprintf的问题~~简单,但是奇怪~

Daniel22_cn 2004-08-25 11:43:35
奇怪啊~~不知道为何~~

看看这个代码. 出现非法操作.
First-chance exception in XyServer.exe (USER32.DLL): 0xC0000005: Access Violation.

TCHAR szSQL[1024] = {0};


wsprintf(szSQL,TEXT("Insert into %s(sheet_no,voucher_no,\
sale_type,cust_no,branch_no,oper_deal_id,oper_check_id,discount,\
no_tax_amount,tax_amount,valid_date,invoice_type,tax_type,tax_rate,\
oper_check_date,work_date,total_amount,paid_amount,account_amount,\
rec_money,approve_flag,clear_flag,in_clear_flag,out_clear_flag,amount_clear_flag,\
oper_id,order_man,oper_date,memo,other1,other2,other3,cust_flowno,no_total_flag,\
active_amount,return_day,return_rate,return_day_1,return_rate_1,depand_company\
vip_card_no,ls_type,dp_no)values('%s','%s','%s','%s','%s','%s','%s','%s',\
'%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s',\
'%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s',\
'%s')"),\
POS_MASTER,pSheetPosHead->szSheetNo,pSheetPosHead->szVoucherNo,pSheetPosHead->szSheetType,\
pSheetPosHead->szCustNo,pSheetPosHead->szBranchNo,pSheetPosHead->szOperDealId,pSheetPosHead->szOperCheckId,\
pSheetPosHead->szDiscount,pSheetPosHead->szNoTaxAmount,pSheetPosHead->szTaxAmount,pSheetPosHead->szValidDate,\
pSheetPosHead->szInvoiceType,pSheetPosHead->szTaxType,pSheetPosHead->szTaxRate,pSheetPosHead->szOperCheckDate,\
pSheetPosHead->szWorkDate,pSheetPosHead->szTotalAmount,pSheetPosHead->szPaidAmount,pSheetPosHead->szAccountAmount,\
pSheetPosHead->szRecMoney,pSheetPosHead->szApproveFlag,pSheetPosHead->szClearFlag,pSheetPosHead->szInClearFlag,\
pSheetPosHead->szOutClearFlag,pSheetPosHead->szAmountClearFlag,pSheetPosHead->szOperId,pSheetPosHead->szOrderMan,\
pSheetPosHead->szOperDate,pSheetPosHead->szMemo,pSheetPosHead->szOther1,pSheetPosHead->szOther2,pSheetPosHead->szOther3,\
pSheetPosHead->szCustFlowNo,pSheetPosHead->szNoTotalFlag,pSheetPosHead->szActiveAmount,\
pSheetPosHead->szReturnDay,pSheetPosHead->szReturnRate,pSheetPosHead->szReturnDay1,pSheetPosHead->szReturnRate1,\
pSheetPosHead->szDepandCompany,pSheetPosHead->szVipCardNo,pSheetPosHead->szLsType,pSheetPosHead->szDpNo);

其中结构的每个成员都可能正常访问..我测试了一下,当我的'%s'超过2个时就非法操作,低于2个就没事..为什么啊?
...全文
158 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
holyeagle 2004-08-25
  • 打赏
  • 举报
回复
超过2个时就非法操作
=============

数组空间太小了。
DentistryDoctor 2004-08-25
  • 打赏
  • 举报
回复
是不是超过了1024字节?用sprintf并将缓冲区定大些试试。
另一个可能是,你用的是%s,但你的第二个以后的参数中有一个或更多的,类型不匹配,比如说为整型等。(不过这儿看来都是sz...)
李马 2004-08-25
  • 打赏
  • 举报
回复
把“\”都去掉,它们在宏定义中表示换行,但是在这里不行,而且会导致转义字符的歧义冲突。
Meteorlet 2004-08-25
  • 打赏
  • 举报
回复
active_amount,return_day,return_rate,return_day_1,return_rate_1,depand_company\
vip_card_no,ls_type,dp_no


depand_company后面少了","号,肯定是对sql语句执行结果没有检查.
你有没有单步调试过?确认是这句话执行完以后造成异常?
wsprintf函数可能会出错只有三个可能:
1. 数组越界
2. %s类型不匹配
3. pSheetPosHead结构体指针为空
Daniel22_cn 2004-08-25
  • 打赏
  • 举报
回复
写漏了..有对应的字符串也是非法操作..

奇怪得很,我还发现一个问题 wsprintf居然不是一一对应的,真实见鬼了.
内存泄漏 2004-08-25
  • 打赏
  • 举报
回复
你写了%s,但是后面没有对应的字符串啊。
Daniel22_cn 2004-08-25
  • 打赏
  • 举报
回复
好像不应该是类型不匹配和数组控件太小的问题.

TCHAR szSQL[10240];
wsprintf(szSQL,TEXT("Insert into %s(sheet_no,voucher_no,\
sale_type,cust_no,branch_no,oper_deal_id,oper_check_id,discount,\
no_tax_amount,tax_amount,valid_date,invoice_type,tax_type,tax_rate,\
oper_check_date,work_date,total_amount,paid_amount,account_amount,\
rec_money,approve_flag,clear_flag,in_clear_flag,out_clear_flag,amount_clear_flag,\
oper_id,order_man,oper_date,memo,other1,other2,other3,cust_flowno,no_total_flag,\
active_amount,return_day,return_rate,return_day_1,return_rate_1,depand_company\
vip_card_no,ls_type,dp_no)values('%s')"));

这样可以正常运行.
TCHAR szSQL10240];

wsprintf(szSQL,TEXT("Insert into %s(sheet_no,voucher_no,\
sale_type,cust_no,branch_no,oper_deal_id,oper_check_id,discount,\
no_tax_amount,tax_amount,valid_date,invoice_type,tax_type,tax_rate,\
oper_check_date,work_date,total_amount,paid_amount,account_amount,\
rec_money,approve_flag,clear_flag,in_clear_flag,out_clear_flag,amount_clear_flag,\
oper_id,order_man,oper_date,memo,other1,other2,other3,cust_flowno,no_total_flag,\
active_amount,return_day,return_rate,return_day_1,return_rate_1,depand_company\
vip_card_no,ls_type,dp_no)values('%s','%s')"));

这样就会非法操作,后面其实就多了一个'%s',不知道为何~

16,473

社区成员

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

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

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