2013-09-27 22 views
0

Мне нужна функция, подобная memchr(), но она должна иметь возможность находить подстроку (строку), не единственный одиночный символ. И он должен вернуть первое вхождение, найденное в строке.Как найти первое вхождение строки в строке

Например

p1 = afunclikememchr(str1,"here the function that can locate this substring",200); 

К модов: Я добавил C++ тег, потому что это также относится и к C++

В двух словах: Я хочу функцию, которая будет называться memstr(), условно ,

Кроме того, я должен использовать стандартные библиотеки C, а не C++, и функция не должна останавливаться, когда он обнаруживает байт '\0'.

+2

strstr будет работать для вас? http://linux.die.net/man/3/strstr – dbeer

+3

Что случилось с [strstr] (http://en.cppreference.com/w/c/string/byte/strstr)? – P0W

+0

std :: поиск делает то, что вы хотите. – john

ответ

0

Вы считаете strstr()?

http://pubs.opengroup.org/onlinepubs/009695399/functions/strstr.html

Функция strstr() должен найти первое вхождение в строке указывает s1 последовательности байтов (за исключением завершающего нулевой байт) в строке, указанной s2.

+0

Да, но он останавливается всякий раз, когда он обнаруживает '\ 0' – user2400925

+0

Если есть '\ 0' _in it_, это не строка ** по определению. Строка завершается в (как раз перед) первой '\ 0'. Может быть, вам нужно немного перефразировать ваш квест?(в строке примера нет '\ 0') – wildplasser

1

Поскольку вы помечено этот вопрос как с c и c++ (что неправильно), я эксплуатирую этот факт ответить на него, как если бы это был вопрос C (я не знаю, если это на самом деле) :

Итак, вы ищете что-то вроде memstr(), которое не является стандартной функцией, но у меня есть реализация here.

Или просто используйте расширение GNU memmem(), если доступно, и вы не против быть нестандартным.

+0

Спасибо за ответ. Я добавил это, потому что вы можете использовать библиотеки C в проектах на C++. – user2400925

+0

Но есть ли другие методы с ANSI C? – user2400925

+0

@ user2400925 № –

0

Вам нужен эквивалент strstr, который будет работать на общих массивах. Это то, что я предполагаю из вашего вопроса. Нет memstr, как вы, вероятно, нашли, поэтому вам придется писать свои собственные.

Что-то вроде этого:

size_t memstr(const unsigned char* arr, size_t length, const unsigned char* tofind, size_t flength) { 
    for(size_t i = 0; i < length-flength; ++i) { 
     if(memcmp(arr+i, tofind, flength) == 0) 
     return i; 
    } 

    return -1; //highest possible unsigned value - eg std::string::npos often implemented like this. 
} 


int main() { 
    const unsigned char arr1[] = {1,2,3,4,5,6,7,8,9,0,3,3,3,3,4,4,4,4,4}; 
    size_t sz = sizeof(arr1)/sizeof(arr1[0]); 
    const unsigned char fnd[] = {3,3,3}; 

    size_t where = memstr(arr1, sz, fnd, 3); 
    return 0; 
} 
Смежные вопросы