C++编译报错error C2041:八进制非法数字'8'问题咨询
解决C2041: illegal digit '8' for base '8'编译错误
错误原因
在C/C++语法中,数字字面量前添加前导零会被编译器识别为八进制数,而八进制数的有效取值范围是0-7,因此08和09属于非法的八进制数字,触发了该编译错误。你的代码中给random赋值08、09的写法违反了这个语法规则。
解决方案
根据实际需求,有两种处理方式:
方式一:仅需要数值等价(推荐)
random是int类型变量,存储的是数值而非带格式的字符串。01和1、08和8在int中是完全相同的数值,前导零在这里没有实际意义。直接去掉所有赋值语句中的前导零即可解决错误:
srand(time(0)); int random = (rand() %10) + 1; LogDebug.Log (atmID, 2, iThreadNo, "sendTransacMsgToRDV", "random number for BVS [%d]",random); switch (random) { case 1: LogDebug.Log (atmID, 2, iThreadNo, "sendTransacMsgToRDV", "Right Hand Thumb"); random = 1; break; case 2: LogDebug.Log (atmID, 2, iThreadNo, "sendTransacMsgToRDV", "Right Hand Index Finger"); random = 2; break; case 3: LogDebug.Log (atmID, 2, iThreadNo, "sendTransacMsgToRDV", "Right Hand Middle Finger"); random = 3; break; case 4: LogDebug.Log (atmID, 2, iThreadNo, "sendTransacMsgToRDV", "Right Ring Finger"); random = 4; break; case 5: LogDebug.Log (atmID, 2, iThreadNo, "sendTransacMsgToRDV", "Right Hand Baby Finger"); random = 5; break; case 6: LogDebug.Log (atmID, 2, iThreadNo, "sendTransacMsgToRDV", "Left Hand Thumb"); random = 6; break; case 7: LogDebug.Log (atmID, 2, iThreadNo, "sendTransacMsgToRDV", "Left Hand Index Finger"); random = 7; break; case 8: LogDebug.Log (atmID, 2, iThreadNo, "sendTransacMsgToRDV", "Left Hand Middle Finger"); random = 8; break; case 9: LogDebug.Log (atmID, 2, iThreadNo, "sendTransacMsgToRDV", "Left Ring Finger"); random = 9; break; case 10: LogDebug.Log (atmID, 2, iThreadNo, "sendTransacMsgToRDV", "Left Hand Baby Finger"); random = 10; break; default: LogDebug.Log (atmID, 2, iThreadNo, "sendTransacMsgToRDV", "Random Number not generated successfully"); break; }
方式二:需要输出带前导零的格式
如果需求是最终输出时显示01、08这类两位带前导零的格式,不需要修改random的赋值,而是在输出时使用格式化字符串控制显示效果。将输出语句中的%d替换为%02d,即可自动为小于10的数字补前导零:
// 示例:输出带前导零的格式 LogDebug.Log (atmID, 2, iThreadNo, "sendTransacMsgToRDV", "formatted number [%02d]", random);
这种方式下,random仍然存储1-10的正常数值,既避免了编译错误,又能实现格式需求。
内容的提问来源于stack exchange,提问作者Syed Omer Gohar
相关产品推荐
相关产品推荐

