Найти первую операцию по указателю char

У меня есть буфер символов, который содержит символы, считанные из файла. Мне нужно взять этот буфер символов и найти в нем первый символ конца строки.

Символы EOL в этом случае — это \n,\r,\f.

Изначально я планировал сделать следующее:

// let's read into our buffer now...
char * m_pLineBuff;
if(!readCharBuf(m_pLineBuff, bytesToRead)) { report("Could not fill line buffer", RPT_ERROR, __PRETTY_FUNCTION__); }

// setup our newline candidates in an array
int iEOLChars[] = {'\n','\f','\r'};

// find the first instance of a newline character
int iEOLPosition = std::find_first_of(m_pLineBuff, m_pLineBuff+bytesToRead, iEOLChars, iEOLChars+3);

Однако я, по-видимому, не могу передать указатель char методу std::find_first_of — я могу передать только целое число. Точная ошибка, которую мне предоставляет компилятор:

error: invalid conversion from ‘char*’ to ‘int’

Это кажется мне странным, так как я определил начальное и конечное расположение моего буфера символов, и я не понимаю, почему он не может выполнить итерацию по ним в поисках первого вхождения любого из моих символов EOL.

Любые советы о том, как решить эту проблему? Есть ли способ использовать find_first_of, или я должен просто перебирать каждую позицию буфера char и проверять, соответствует ли char в этом месте любому из моих символов EOL.

Я имею в виду функцию find_first_of: http://www.cplusplus.com/reference/algorithm/find_first_of/

Любая помощь всегда приветствуется.


person BSchlinker    schedule 10.08.2011    source источник
comment
Почему вы не можете передать char* в find_first_of, какую ошибку вы получаете? Если вы этого не скажете, людям придется пытаться скомпилировать ваш код, а у большинства людей нет на это времени. Это может быть разницей между ответом или нет.   -  person Seth Carnegie    schedule 10.08.2011
comment
@Seth Carnegie Хороший вопрос - я обновил, чтобы включить эту информацию.   -  person BSchlinker    schedule 10.08.2011
comment
Почему люди до сих пор используют венгерскую нотацию? :/   -  person ThiefMaster    schedule 10.08.2011
comment
@ThiefMaster, я пишу здесь код для стажировки, и стиль кода требует венгерской нотации. Тем не менее, я нашел его весьма полезным во время моей стажировки и, вероятно, продолжу использовать его после этого.   -  person BSchlinker    schedule 10.08.2011
comment
Хорошо ... я понял из ответов. /** Просто из любопытства, почему char * может быть итератором? Первые два аргумента — char *, а последние два — int *, верно? Я всего лишь студент, пытающийся понять этот материал. Объяснение будет высоко оценено... спасибо. */   -  person mmtauqir    schedule 10.08.2011
comment
@mtahmed, я указываю начальную и конечную границы char * (буфер char в моем случае). Поскольку мы знаем размер символа (sizeof(char)), мы можем перебирать буфер символов с этими начальными и конечными границами.   -  person BSchlinker    schedule 10.08.2011
comment
@mtahmed в этом вся прелесть шаблонов. STL был разработан таким образом, чтобы операторы ++, ==, *, -> и != можно было использовать в итераторах, а шаблонные функции, принимающие итераторы, использовали только эти операторы. Указатели используют одни и те же операторы для одних и тех же операций, поэтому при использовании шаблонов компилятор все вычисляет за вас, и вы можете использовать любой тип, который поддерживает эти операторы.   -  person Seth Carnegie    schedule 10.08.2011
comment
@BSchlinker: Возможно, вы захотите прочитать статьи о том, почему HN плохой (если вы более tl; dr человек: особенно в строго типизированных языках среда IDE может сообщить вам тип переменной. Ввод его в имя требует, чтобы вы изменили во многих местах, если вы измените тип - и даже если IDE сделает это за вас, она все равно создаст излишне большие различия и сделает конфликты слияния (в зависимости от вашей системы контроля версий) более вероятными). Однако префикс глобальных переменных и переменных-членов — это нормально.   -  person ThiefMaster    schedule 10.08.2011


Ответы (3)


В данном случае функция find_first_of возвращает указатель, а не индекс, поэтому попробуйте:

char *iEOLPosition = std::find_first_of(m_pLineBuff, m_pLineBuff+bytesToRead, iEOLChars, iEOLChars+3);
person Rudy Velthuis    schedule 10.08.2011
comment
Спасибо. Я действительно ценю помощь - я не должен был предполагать, что он вернет целочисленный индекс. Моя вина в использовании строк C++ и недостаточном количестве char *. - person BSchlinker; 10.08.2011
comment
И в более общем случае возвращаемые значения имеют тот же тип, что и первые два аргумента. - person AProgrammer; 10.08.2011
comment
@BSchlinker: Использование C++ std::strings, если вы можете, IMO, намного лучше. - person Rudy Velthuis; 10.08.2011

Я думаю, что проблема заключается в несоответствии типов здесь:

char * m_pLineBuff;

int iEOLChars[] = {'\n','\f','\r'};

Попробуйте объявить свой iEOLChars массивом char.

person Antonio Pérez    schedule 10.08.2011
comment
Это противоположно проблеме - cplusplus.com/reference/algorithm/find_first_of требуются целые числа, а не char* - person BSchlinker; 10.08.2011
comment
@BSchlinker это шаблон, как он может требовать целые числа? Этот ответ (я считаю) правильным. Это становится очевидным, если вы посмотрите на код той страницы, на которую вы ссылаетесь. - person Seth Carnegie; 10.08.2011
comment
Ранее я передавал ему массив символов, дважды получал ту же ошибку в этом сценарии. - person BSchlinker; 10.08.2011
comment
Это шаблон, поэтому требуется, чтобы все типы параметров совпадали. Все int или все char, но все равно. - person Antonio Pérez; 10.08.2011
comment
Вы также изменили тип переменной, которой вы присваиваете возвращаемое значение? - person Antonio Pérez; 10.08.2011
comment
Тип возврата был таким - я неправильно понял ваш первоначальный комментарий, Антонио, приношу свои извинения. - person BSchlinker; 10.08.2011
comment
find_first_of принимает 2 группы по 2 итератора, и итераторы не обязательно должны иметь один и тот же тип или тип значения. - person AProgrammer; 10.08.2011
comment
@AProgrammer: правильно, мой предыдущий комментарий неточен, вам просто нужно, чтобы существовал оператор '==' или неявное преобразование для обоих типов значений. - person Antonio Pérez; 10.08.2011

Проверьте свою функцию first_first_of. Я думаю, что она никогда не может иметь 4 параметра
См. first_first_of

person Shadow    schedule 10.08.2011
comment
Это было бы верно для find_first_of для строки, но это для char *. См. cplusplus.com/reference/algorithm/find_first_of. - person BSchlinker; 10.08.2011
comment
Он использует std::find_first_of (cplusplus.com/reference/algorithm/find_first_of ), а не std::string::find_first_of - person Antonio Pérez; 10.08.2011
comment
Извини, я виноват!! Надо было хорошенько посмотреть, прежде чем постить - person Shadow; 10.08.2011