Есть ли функция C, чтобы найти второе вхождение подстроки в строке? - PullRequest
1 голос
/ 02 февраля 2010

Существует ли функция C для нахождения второго вхождения подстроки в строке?

ie String - "213 Состояние файла 550 Доступ запрещен. 550 Доступ запрещен."

Эта функциявернул бы "550 найдено дважды" ....

Ответы [ 7 ]

11 голосов
/ 02 февраля 2010

Использование strstr.

int count_550s(char const *str)
{
    char const *p = str;
    int count;
    for (count = 0; ; ++count) {
        p = strstr(p, "550");
        if (!p)
            break;
        p++;
    }
    return count;
}

Редактировать: забыл "вернуть".

5 голосов
/ 02 февраля 2010

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

3 голосов
/ 02 февраля 2010

Вы можете сделать это, вызвав strstr в цикле (стог сена ссылается на строку, которую вы ищете в «213 Статус файла 550 Доступ запрещен. 550 Доступ запрещен», а игла ссылается на строку, которую вы ищете «550») :

unsigned int count = 0;
const char *next = haystack
while ((next = strstr(next, needle)) != NULL)
{
    ++count;
    ++next;
}

Если два экземпляра вашей иглы могут чрезмерно друг друга (поэтому вы ищете «555», а в строке есть «5555», это будет считать два экземпляра). Если вы не хотите этого, вы должны изменить ++next на next += strlen(needle);

2 голосов
/ 02 февраля 2010

Вы можете сделать это так:

char *yourText = "213 File status 550 Access Denied. 550 Access Denied.";

char *found = strstr(yourText, "550 Access Denied");

if(found != NULL && strstr(found+1, "550 Access Denied"))
{
    // second occurrence found
}

Но если вы намерены найти дубликаты в целом (то есть, не зная строку поиска), вам следует использовать библиотеку регулярных выражений, которая поддерживает сопоставление одного и того же шаблона группы дважды.

2 голосов
/ 02 февраля 2010

Посмотрите на эту функцию ' strtok ', найденную здесь и на веб-сайте GNU здесь . Вот еще одна ссылка о найденной функции * strtok здесь также.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

1 голос
/ 02 февраля 2010

Нет, но вы можете создать его самостоятельно.

const char *find_second_substring(const char *findme,const char *str)
{
   const char *tmp;
   if((tmp = strstr(str,findme)) != null) {
     tmp = strstr(tmp  +strlen(findme),findme);
   }

  return tmp;
}
1 голос
/ 02 февраля 2010

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

...