char M[20]; sprintf( M,"Input number:%d",TempValue);前面的M[20]是用来干什么的

我想在wincc做一个,输入/输出域实现带确认的输入操作,下面是我在网上拷贝的程序
int TempValue=GetTagWord("T");
char M[20];
sprintf( M,"Input number:%d",TempValue);
if ( nChar==13 )//if press enter
{
int xRet = MessageBox(NULL,M,"确认窗口",MB_YESNO|MB_ICONQUESTION|MB_SYSTEMMODAL);//message
if ( xRet == IDYES )//confirm operate
{
SetTagWord("DisplayValue",TempValue);// set data
}
}
char M[20]是字符串我知道,char能容纳的数值最大不是255嘛,为什么我在T中输入的数只要小于65536的数就能输出?还有我把char M[20]里的20改成1,它也能一样运行。char M[20]到底是做什么用的。

最佳答案

1、为什么我在T中输入的数只要小于65536的数就能输出?
这个数在被写入M时已经由sprintf函数转换为字符串,所以跟T的大小没有关系。至于为什么小于65536就是由于GetTagWord只能返回0-65536之间的数。
2、把char M[20]里的20改成1,它也能一样运行。char M[20]到底是做什么用的?
在这里M是作为一个字符串的临时存储区,用来存储后面要显示的“Input number:X",由于你把临时变量声明为int,所以考虑到负号,你的程序需要的最小空间就是20个char,你改为1,意思就是只保留了一个字符空间,也就是说”I“是没问题的,但后面的所有字符都处于不安全的状态,既可能被其它程序改写,也可能覆盖了其它程序的数据,虽然也能运行,只能表明在那个时刻没有表现出严重错误罢了。一直这么使用,必定会出问题 ,比如死机。

另外建议养成习惯:int对应GetTagSWord,WORD对应GetTagWord。

提问者对于答案的评价:
谢谢你的解答,但为什么说“由于你把临时变量声明为int,所以考虑到负号,你的程序需要的最小空间就是20个char”是不是这样,如果我只显示Input number:就只用12个char就行?

最佳答案作者回复:
在c语言中,字符串的末尾是固定有一个字符”\0”的,所以你想要只显示”Input number:“,那也不是12个字符,而是14个字符,里面你没有计算到的空格和字符”\0”。现在你该明白为什么我说最小空间就是20个char。

原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc134621.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2017年5月31日
下一篇 2017年5月31日

相关推荐