strtok()函数错误地标记字符串

时间:2017-10-17 14:31:34

标签: c strtok

我正在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

2 个答案:

答案 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修改字符串,修改字符串文字是未定义的行为。