strchr(), APT_String и операция вычитания
Я работаю с программой, написанной на C, которая включает сравнение переносимых фамилий. Например, он мог бы сравнить Мэри Джей Блайдж с Мэри Кэй Блайдж. Код, который находит дефис и устанавливает переменную в его позицию:
APT_String LAST_NAME
char * p_ich;
int iPosHyphen;
p_ich = strchr(LAST_NAME,'-');
iPosHyphen = p_ich-LAST_NAME+1;
где APT_String - тип данных для IBM DataStage.
Я унаследовал вышеуказанный код, и он, кажется, "работает", но я хотел бы получить некоторые разъяснения по p_ich-LAST_NAME+1
операция. А именно, если strchr()
возвращает местоположение первого '-', как C обрабатывает эту арифметику?
Если я позвоню cout<<p_ich;
, Я получил -Blige
, Итак, я думаю, что он возвращает остаток строки, как только указанный символ найден?
2 ответа
Да, strchr возвращает адрес первого вхождения (не индекс). Таким образом, вы вычитаете исходную строку (адрес) из этого, чтобы получить положение дефиса. Но здесь +1 дает вам первую позицию (индекс) после дефиса.
Такой, что p_ich[iPosHyphen] == 'B'.
Это очень простая арифметика C-указателя, и вы можете легко найти много информации об этом.
Вычитание одного указателя из другого дает расстояние между их индексами, как если бы они были частью одного массива. В вашем примере это будет расстояние между *p_ich* и *LAST_NAME*. При стандартном типе символов расстояние будет равно разнице между адресами памяти, но в целом:
ptr1-ptr2 == ((unsigned long)ptr - (unsigned long)ptr2)/sizeof(*ptr)