2017-10-08 89 views
-1

我在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"); 
} 
}*/ 
+1

为什么你的代码在评论里面?另请发布[MVCE](https://stackoverflow.com/help/mcve)。 – sepp2k

+2

“做数学运算”的部分在哪里?如果您在包含的代码中评论main',它是否按预期工作? – rici

回答

0

strtol在你使用它的方式,使用十六进制ASCII转换成二进制整数形式。作为一个intlong然后你可以对它进行操作(加,减,乘等等),你不能对ASCII(字符串)形式的数字进行操作。要实际显示一个数字,您需要将其转换回ASCII,这就是printf所做的。随着%d转换将其转换为ASCII码 - 如果你想ASCII十六进制,使用%x


严格来说,它可能是任何字符集,不一定是ASCII,但几乎所有的C编译器使用ASCII或其基本字符集的一些扩展

+0

OP在'tok == HEX'情况下已经使用'%x'。 – sepp2k