实际上承认16进制,十六进制计算器诺托将Flex和野牛
问题描述:
我在flex和野牛 计算器一个问题,这个代码实际上承认16进制,十六进制计算器诺托将Flex和野牛
0[xX][0-9a-fA-F]+ {yylval=strtol(yytext,0 ,16);return HEX;}
它实际上承认十六进制值,并做数学运算,但当我想打印结果时,以十进制打印。
,所以我认为它是一个室内用的问题这一部分:
/*main(int argc, char **argv)
{
int tok;
while(tok = yylex()) {
printf("%d", tok);
if(tok == NUMBER) printf(" = %d\n", yylval);
else
if(tok == HEX)
printf(" = %x\n", yylval);
else
printf("\n");
}
}*/
答
strtol
在你使用它的方式,使用十六进制ASCII转换成二进制整数形式。作为一个int
或long
然后你可以对它进行操作(加,减,乘等等),你不能对ASCII(字符串)形式的数字进行操作。要实际显示一个数字,您需要将其转换回ASCII,这就是printf
所做的。随着%d
转换将其转换为ASCII码 - 如果你想ASCII十六进制,使用%x
严格来说,它可能是任何字符集,不一定是ASCII,但几乎所有的C编译器使用ASCII或其基本字符集的一些扩展
+0
OP在'tok == HEX'情况下已经使用'%x'。 – sepp2k
为什么你的代码在评论里面?另请发布[MVCE](https://*.com/help/mcve)。 – sepp2k
“做数学运算”的部分在哪里?如果您在包含的代码中评论main',它是否按预期工作? – rici