strchr (), APT_String и операция вычитания - PullRequest
0 голосов
/ 14 мая 2011

Я работаю с программой, написанной на 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 ]

1 голос
/ 14 мая 2011

Это очень простая арифметика C-указателя, и вы можете легко найти много информации о ней.

Вычитание одного указателя из другого дает расстояние между их индексами, как если бы они были частью одного массива. В вашем примере это будет расстояние между * p_ich * и * LAST_NAME *. При стандартном типе символов расстояние будет равно разнице между адресами памяти, но в целом:

ptr1-ptr2 == ((unsigned long)ptr - (unsigned long)ptr2)/sizeof(*ptr)
1 голос
/ 14 мая 2011

Да, strchr возвращает адрес первого вхождения (не индекс).Таким образом, вы вычитаете исходную строку (адрес) из этого, чтобы получить положение дефиса.Но здесь +1 дает вам первую позицию (индекс) после дефиса.

Так, что p_ich [iPosHyphen] == 'B'.

...