последовательный вызов функции возвращает одинаковые результаты

#c #parsing

#c #Синтаксический анализ

Вопрос:

Я пытаюсь извлечь URL-адреса из строк. Итак, я написал что-то вроде этого:

 #include "string.h"
#include "stdio.h"
#define BAD(x) (!(x) || (*(x) == ''))

static char *extract_link(char *string)
{
        static char url[512];
        int length;
        char *st;
        char *rl;
        char *rl2;
        url[0] = '';

        rl = strstr(string, "http://");
        if (!BAD(rl))
        {
                if (strstr(rl, " "))
                {
                        st = strstr(rl, " ");
                        length = strlen(rl) - strlen(st);
                        strncpy(url, rl, length);
                        url[length] = '';
                        return url;
                }
                return rl;
        }
        rl2 = strstr(string, "www.");
        if (!BAD(rl2))
        {
                if (strchr(rl2, ' '))
                {
                        st = strstr(rl2, " ");
                        length = strlen(rl2) - strlen(st);
                        strncpy(url, rl2, length);
                        url[length] = '';
                        return url;
                }
                return rl2;
        }
        return NULL;
}
int main()
{
        char *string1 = "We have a http://www.youtube.com/watch?v=zyP48_0C1DMamp;feature=featured here";
        char *string2 = "And We have a www.scribd.com/doc/52344388/JOINT-STATEMENT-ON-U-S-FUNDING-FOR-GLOBAL-CHILD-SURVIVAL-AND-MATERNAL-HEALTH or whatsoever";
        char *x = extract_link(string1), *y = extract_link(string2);
        if (!BAD(x))
                printf("%sn", x);
        if (!BAD(y))
                printf("%sn", y);
        return 0;
}
  

Но я получаю одни и те же результаты снова и снова.
Вывод:

www.scribd.com/doc/52344388/JOINT-STATEMENT-ON-U-S-FUNDING-FOR-GLOBAL-CHILD-SURVIVAL-AND-MATERNAL-HEALTH www.scribd.com/doc/52344388/JOINT-STATEMENT-ON-U-S-FUNDING-FOR-GLOBAL-CHILD-SURVIVAL-AND-MATERNAL-HEALTH

Это должно быть так:

http://www.youtube.com/watch?v=5fuUTMJ8WRAamp;feature=feedrec_grec_index www.scribd.com/doc/52344388/JOINT-STATEMENT-ON-U-S-FUNDING-FOR-GLOBAL-CHILD-SURVIVAL-AND-MATERNAL-HEALTH

Итак… Что я делаю не так? Что вы думаете о приведенном выше коде. Итак, что мне нужно изменить или переписать?

Ответ №1:

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

В каждом подходе есть компромиссы. Для той, которую вы использовали, вы могли бы оставить ее в покое и изменить main на:

 char *string1 = "We have a http://www.youtube.com/watch?v=zyP48_0C1DMamp;feature=featured here";
char *string2 = "And We have a www.scribd.com/doc/52344388/JOINT-STATEMENT-ON-U-S-FUNDING-FOR-GLOBAL-CHILD-SURVIVAL-AND-MATERNAL-HEALTH or whatsoever";
char *x = extract_link(string1);
if (!BAD(x))
      printf("%sn", x);
x = extract_link(string2);
if (!BAD(x))
       printf("%sn", x);
return 0;
  

Комментарии:

1. Спасибо. Что насчет процедуры? Я имею в виду, можете ли вы сказать, что код эффективен? Или можно написать более эффективно?

2. Трудно сказать. Это скорее проблема спецификации, чем вопрос эффективности. http:// Следует удалить? Ответ зависит от использования результатов.

3. Нет. Если строка содержит URL, начинающийся с http://, извлечения его будет более чем достаточно. То же самое касается URL-адресов, которые соответствуют www. Итак, короче говоря, их нужно оставить в покое. Достаточно просто извлечь. Я не знаю о вещах, связанных с производительностью. Итак, я должен спросить вас. Спасибо.

4. Если этот код не вызывается более 10000 раз в секунду, не беспокойтесь о его производительности.