получить подстроку из строки в C - PullRequest
1 голос
/ 14 декабря 2010

Я пытаюсь написать программу на C, которая позволит мне получить нужную строку между двумя другими строками, которые будут определены. Чтобы быть более конкретным, мой пример строки

 "blahblah<mailto:agent007@example.org>blahblahblah"

и мне нужно иметь возможность извлечь подстроку «agent007» в новую переменную. Я пробовал метод strtok (), но дело в том, что я не могу извлечь токены в новую переменную или массив. Я токенизировал строку, и выражение, которое мне подходит, было бы примерно таким: " если token [i] ==" mailto "&& token [i + 2] ==" example ", то mailAdd = token [i + 1] " (псевдокодовым способом :))

моя программа до сих пор

#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="blahblah<mailto:agent007@example.org>blahblahblah";
  char * tch;
  tch = strtok (str,"<:@");
  while (tch != NULL)
  { 
    printf ("%s\n",tch);
    tch = strtok (NULL, "<:@");
  }
  return 0;
}

Конечно, любые другие предложения, кроме токенов, будут высоко оценены -

Ответы [ 2 ]

2 голосов
/ 14 декабря 2010

Моей первой мыслью было использование strstr для «mailto:» и strchr для «@»

// pseudo code
char *mailto = strstr(src, "mailto:"); // possibly convert src to lowercase
char *atsign = strchr(mailto, '@');
while (mailto < atsign) *dst++ = *mailto++;

Конечно, это очень грубый проект. Требуется много доработок (не удалось найти строку «mailto:» или символ «@», проверка ошибок, особые случаи, тесты, ...)


Сохранение указателя strtok

#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="blahblah<mailto:agent007@example.org>blahblahblah";
  char * tch;
  char * saved;                     /* pmg */
  tch = strtok (str,"<:@");
  while (tch != NULL)
  { 
    int savenext = 0;               /* pmg */
    if (!strcmp(tch, "mailto"))     /* pmg, UNTESTED CODE, need to check case? */
    {                               /* pmg */
      savenext = 1;                 /* pmg */
    }                               /* pmg */
    printf ("%s\n",tch);
    tch = strtok (NULL, "<:@");
    if (savenext == 1)              /* pmg, UNTESTED CODE */
    {                               /* pmg */
      saved = tch;                  /* pmg */
    }                               /* pmg */
  }
  printf ("saved: %s\n", saved);    /* pmg */
  return 0;
}
1 голос
/ 14 декабря 2010

Вы можете использовать strstr для поиска 'mailto:', а затем strchr для поиска '@' и использовать символы между ними.Я никогда не использую strtok, но не вижу, что не так с тем, что вы сделали.

Вот пример, где email должен указывать на "agent007" в вашем случае.Обработка ошибок здесь отсутствует.Это разрушительно, это означает, что оно изменяет входную строку, но так же strtok.

char *mailto = strstr( str, "mailto:" );
char *at = strchr( mailto, '@' );
char *email = mailto + strlen("mailto:");
*at = '\0';
...