我正在C中实现pass 2汇编程序并尝试使用strtok()
获取表达式的术语。该函数正在while
循环内正确运行,但它没有正确生成令牌。
以下是生成令牌的代码:
char *terms[50];
char *operand="THREE-3"
char delimit[] = "+-\*";
int k = 0;
terms[k] = strtok(operand,delimit);
while(terms[k] != NULL)
{
printf("token [%d]=%s\n",k,terms[k]);
k++;
terms[k]=strtok(NULL,delimit);
}
这是输出:
token [0]=3
token [0]=3
token [0]=3
token [0]=3
token [0]=3
token [0]=3
token [0]=3
token [0]=3
token [0]=3
token [0]=3
token [0]=3
token [0]=3
token [0]=3
token [0]=3
token [0]=3
token [0]=THREE
token [1]=3
token [0]=THREE
token [0]=THREE
token [0]=THREE
token [0]=THREE
token [0]=THREE
token [0]=THREE
token [0]=THREE
token [0]=THREE
token [0]=THREE
token [0]=THREE
token [0]=THREE
token [0]=THREE
token [0]=THREE
token [0]=THREE
token [0]=THREE
token [0]=THREE
token [0]=THREE
token [0]=THREE
token [0]=THREE
token [0]=THREE
token [0]=THREE
答案 0 :(得分:3)
问题是不允许修改参数operand
并且strtok()
修改它的第一个参数,因此,您的代码会导致undefined behavior。
相关说明:
operand
是一个指向字符串文字"THREE-3"
的指针。
引用C11
,章节§6.4.5
[...]如果程序试图修改这样的数组,行为是 未定义。
strtok()
行为,来自章节§7.24.5.8(强调我的)
然后strtok函数从那里搜索包含在中的字符 当前分隔符字符串如果找不到这样的字符,则当前令牌扩展到 s1指向的字符串的结尾,随后对标记的搜索将返回null 指针。 如果找到这样的字符,它将被空字符覆盖,这是一个空字符 终止当前令牌。 strtok函数保存指向以下内容的指针 字符,从中开始下一次搜索令牌。
这意味着strtok()
修改了它的第一个参数。
最简单的解决方案是使operand
成为一个数组并使用所需的字符串文字对其进行初始化,然后将其作为第一个参数传递给strtok()
。
答案 1 :(得分:3)
更改
char *operand = "THREE-3"; // here operand points to a string literal
到
char operand[] = "THREE-3"; // here operand is an array of chars terminated by a NUL char
strtok
修改字符串,修改字符串文字是未定义的行为。