2014-11-16 4 views
2

У меня есть этот код, чтобы взять строку формы 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 обрабатывает другую проблему.

+1

@ Rizier123: это ничего не изменит в отношении точек последовательности. –

ответ

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') 

для предотвращения переполнения буфера.

+0

Постановлением я имел в виду, что это было не UB, но да, я понял. – gsamaras

+0

> «_It является выбором компилятора ... является доступ до или после_». Строго говоря, код может сделать что-либо помимо этих двух опций. – AlexD

+0

Кроме того, этот код не помещает нулевой ограничитель в строку. Я вижу вашу точку @AlexD, спасибо тоже. – gsamaras

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'; 
} 
+0

+1 для предложения указателя, но я принимаю другой ответ, потому что он пришел первым. :) – gsamaras

+0

@ G.Samaras [Самый быстрый пистолет на Западе проблемы] (https://meta.stackexchange.com/questions/9731/fastest-gun-in-the-west-problem) –

+0

Спасибо за ссылку, интересно! – gsamaras

 Смежные вопросы

  • Нет связанных вопросов^_^