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)
Другие вопросы по тегам