4

我有这个代码来获取表单的字符串bla_2并将其分隔:

void separate(char* str, char* word, int* n) {
    int i = 0;
    while(str[i] != '_') {
        word[i] = str[i++];
    }
    *n = str[++i] - '0';
}

我有:

warning: operation on ‘i’ may be undefined [-Wsequence-point]

但我只是i通过++操作员进行更改,我没有分配任何东西。

那么,为什么是UB,如果是的话?如果没有,如何摆脱警告?

请注意,在我看来,这个问题处理了一个不同的问题。

4

2 回答 2

6

word[i] = str[i++];是个问题。

如果iinword[i]是访问 before 或 afteri增加 in是编译器的选择str[i++];

完成i++任务后

word[i] = str[i];
i++;

进一步while(str[i] != '_')可能应该是

while(str[i] != '_' && str[i] != '\0')

以防止缓冲区溢出。

于 2014-11-16T20:48:34.993 回答
2

原因是赋值的两边都依赖于 的值i,但是,您i在语句中进行了修改,而 . 的两次使用之间没有序列点i。根据 C 标准,这会导致未定义的行为。

要修复此警告,请将相关行更改为

word[i] = str[i];
i++;

顺便说一句,您可以使用指针而不是显式索引,这可能会使代码更具可读性:

void separate(char* str, char* word, int* n) {
    while(*str != '_') {
        *word++ = *str++;
    }

    *n = *++str - '0';
}
于 2014-11-16T20:48:54.053 回答