- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了以下词法分析器。它适用于以下输入:c&3&f、(3|6)&c、f^1。然而,我得到的 strtol 结果并不一致。当我运行 <3|3 时,它将前 3 个值的十六进制 3 转换为十进制 8,然后将第二个值正确地转换为 3。这就是我的整个计划。问题出在最后一个函数上。我添加了 printf 来调试我的代码。 (通过 stdin < 传递一个文本文件来运行。每行新表达式)
代码也可以在以下位置找到:Github
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//Max number of characters on new line from file
#define LINE_MAX 1028
char expression[LINE_MAX];
int position;
char next();
char peek();
int E();
int EE(int i);
int A();
int AA(int i);
int B();
int BB(int i);
int C();
int main ( int argc, char *argv[] )
{
char line[LINE_MAX];
while (fgets(line, LINE_MAX, stdin) != NULL) {
//remove the newline character for printing the expression
size_t strlength = strlen(line);
line[strlength-1] = '\0';
//reset global variables
position = 0;
strcpy(expression, line);
int result = E();
printf("%s = %x\n", line, result);
}
}
char next(){
return expression[position++];
}
char peek(){
return expression[position];
}
int E(){
int st = A();
return EE(st);
}
//bitwise "|" OR
int EE(int i){
char token = peek();
if (token == '|'){
next();
int val = A();
return EE(i | val);
}else{
return i;
}
}
int A(){
int st = B();
return AA(st);
}
//bitwise "^" XOR
int AA(int i){
char token = peek();
if (token == '^'){
next();
int val = B();
return AA(i ^ val);
}else{
return i;
}
}
int B(){
int st = C();
return BB(st);
}
//bitwise "&" AND
int BB(int i){
char token = peek();
if (token == '&'){
next();
int val = C();
return BB(i & val);
}else{
return i;
}
}
/*********************************************************************
*********************************************************************
This is the function I am having a problem with. Strtol is giving me
inconsistent integer values.
*********************************************************************
*********************************************************************/
int C(){
char token = next();
if(token == '<'){
//bitwise shift secondToken <<
printf("BITEWISE LEFT SHIFT: %c\n", token);
return (C() << 1) & 15; //0xf;
}else if(token == '>'){
//bitwise shift secondToken >>
return C() >> 1;
}else if(token == '~'){
//bitwise not secondToken ~
printf("BITEWISE NOT: %c\n", token);
return (~C()) & 15;
}else if(token == '('){
int val = E();
next();
return val;
}else{
printf("TOKEN: %c\n", token);
//return the token hex value as int
char temp[1];
temp[0] = token;
printf("TEMP 0: %c\n", temp[0]);
printf("TOKEN int: %d\n", (int)strtol(temp, NULL, 16) & 15);
return (int)(strtol(temp, NULL, 16) & 15); //0xf;
}
}
c&3&f和<3|3的运行结果如下:
TOKEN: c
TEMP 0: c
TOKEN int: 12
TOKEN: 3
TEMP 0: 3
TOKEN int: 3
TOKEN: f
TEMP 0: f
TOKEN int: 15
c&3&f = 0
BITEWISE LEFT SHIFT: <
TOKEN: 3
TEMP 0: 3
TOKEN int: 8
TOKEN: 3
TEMP 0: 3
TOKEN int: 3
<3|3 = 3
正如您所看到的,第二个表达式的第一个“TOKEN int”值应该是 3,但它返回 8。然后它会正确地将 3 转换为 3。有谁知道为什么会发生这种情况? strtol如何转换为十进制?
最佳答案
更改:
char temp[1];
temp[0] = token;
进入:
char temp[2];
temp[0] = token;
temp[1] = '\0';
(假设您只想处理个位数)。
当你在前一种情况下执行strtol()
时,它需要一个C风格的字符串,并且你给出的内容不能保证为空 -终止。
所以可能发生的情况是,您的内存中有类似 38q
的内容,strotol(temp,NULL,16)
会将其转换为 56
当与 15
进行与运算时,将得到 8
。
关于c - c 中的 strtol 没有给我一致的值。 strtol 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26900235/
我编写了以下词法分析器。它适用于以下输入:c&3&f、(3|6)&c、f^1。然而,我得到的 strtol 结果并不一致。当我运行 #include #include //Max number
我正在使用 strtol 从字符串中解析整数。我打算使用 strtol 的第二个参数来确定整个字符串是否被解析为数字。我有这样的代码(字符串永远不会代表 token; const size_t tok
strtol 规范在概念上将输入字符串分为“初始空白”、“主题序列”和“最终字符串”,并将“主题序列”定义为: the longest initial subsequence of the input
我只是好奇这个。 strtol 不需要您指定要处理的字节数,因此理论上它可能会被提供一个包含无穷无尽的数字序列的字符串以供使用,从而导致拒绝服务攻击。当然,一旦意识到 long 的精度已经用尽(实际上
关闭。这个问题需要 details or clarity 。目前不接受答案。 想要改进这个问题?通过 editing this post 添加详细信息并澄清问题。 已关闭 5 年前。 奥 git _a
这周我刚刚开始学习c。 我正在尝试将单个字符转换为 long/int。 我的问题是,当我通过 main 调用 convenrtCharToInt 时,它返回正确的值,但是当我通过另一个函数调用此函数,
我有这段代码,应该可以正常运行,但由于某种原因,当我在循环的条件检查之前释放字符串时,循环会循环。摆脱循环的唯一方法是给出超过 3 位的整数(输入 > 99 || 输入 #include #inc
当我使用 strtol() 函数时,当我尝试转换时: 2015-08-12 我希望它转换失败而不是仅转换 2015? int main(int argc, char *argv[]) { p
使用指针: char a[]=" 0xa this is a343 good"; char* *endptr=NULL; long int b=0; b=strtol(a,endptr,0); b=s
您好,我制作了一个测试程序,以便在我对以下代码使用 valgrind --track-origins=yes -v ./a.out 时获得如何解决问题的帮助它返回以下错误; ==13192== 1 e
有人可以帮助我理解为什么我看到相同输入的不同输出吗? “n”的输出是 2147483647,这是不正确的。为什么? --------输出------------ FF FF FF FF FFFFFF
strtol 的第二个参数是如何工作的? 这是我尝试过的: strtol(str, &ptr, 10) 其中 ptr 是一个 char * 而 str 是一个字符串。现在,如果我将 str 作为 '3
所以我有两个十六进制字符串 - "3b101c091d53320c000910" 和 "071d154502010a04000419"。当我对它们使用 strtol() 时,我得到两个字符串的相同值。
我正在尝试使用以下代码使用 strtol 将字符数组转换为整数: int foo = strtol(temp, (char **)NULL, 0); 其中温度 = 4000000010 但是 strt
这个问题在这里已经有了答案: strtol using errno (5 个答案) 关闭 8 年前。 基本上使用 strtol 来检查不成功的转换,我正在使用函数 width = (int) st
我真的很困惑。我必须遗漏一些相当简单的东西,但我读到的关于 strtol() 的内容没有任何意义。有人可以用一种非常基本的方式为我阐明它,并举例说明我如何使类似以下的东西起作用吗? string in
根据 C11 (n1570) 中的 § 7.22.1.4,必须声明 strtol: #include long int strtol (const char *restrict nptr,
此代码似乎按预期工作,使用单个指针填充数字数组 #include #include #include int main(void) { int arr[4], count = 0, i;
我这里有一个奇怪的。当我传入以下字符串时,strtol、atol 和 atoi 都返回不正确的值: long test = strtol("3087663490", &p, 10); 根据我的调试器,
我正在围绕 strtol() 创建一个包装函数对于 int16_t ,我遇到了一个问题:如何处理 0x 这样的输入?也就是说,它作为数字有效吗 0 , 后跟非数字 x , 或者它是无效的因为后面没有任
我是一名优秀的程序员,十分优秀!