我有这段代码采用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,如果是的话?如果没有,如何摆脱警告?
请注意,在我看来,this问题会处理不同的问题。
答案 0 :(得分:4)
word[i] = str[i++];
是个问题。
如果i
中word[i]
i
str[i++];
i++
word[i] = str[i];
i++;
在while(str[i] != '_')
中递增while(str[i] != '_' && str[i] != '\0')
在作业后执行{{1}}
{{1}}
进一步{{1}}可能应该是
{{1}}
防止缓冲区溢出。
答案 1 :(得分: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';
}