使用sprintf动态控制小数位数时触发memory violation问题求助
问题排查与解决
嘿,你的问题根源不是%.*f格式不被支持——这个格式说明符是完全合法且常用的,问题出在你的sprintf参数顺序搞错啦!
错误原因分析
sprintf的函数原型是:
int sprintf(char *str, const char *format, ...);
第一个参数必须是目标缓冲区(也就是你要写入的字符串数组graduationText),第二个才是格式字符串"%.*f",但你把这两个参数的位置写反了!这就导致程序试图往格式字符串"%.*f"所在的只读常量内存区域写入数据,直接触发了内存访问违规错误。
修正后的代码
把参数顺序调整过来就没问题了:
char graduationText[1024]; sprintf(graduationText, "%.*f", decimalsToShow, graduation);
这里%.*f的作用就是用decimalsToShow这个整数参数,动态指定浮点数graduation要显示的小数位数,完全匹配你的需求。
额外安全建议
如果你的环境支持,更推荐使用snprintf替代sprintf,它可以限制写入的字节数,避免缓冲区溢出(比如生成的字符串长度超过1024时):
snprintf(graduationText, sizeof(graduationText), "%.*f", decimalsToShow, graduation);
内容的提问来源于stack exchange,提问作者Léo Coletta
相关产品推荐
相关产品推荐

