Вот кое-что, что будет иметь дело с подстрокой переменной ширины, которая не заботится о начальной позиции подстроки.Например, если строка была iax2:xxx@xx.xx.xx.xx
, она все равно будет работать.Однако он вернет NULL, если ни один из разделителей не найден.
Он использует strchr()
для поиска разделителей, что позволяет нам знать, где начать копирование и где остановиться.Он возвращает выделенную строку, вызывающая функция должна free()
возвращать указатель.
Я почти уверен, что это то, что вы хотите?
Примечание: отредактировано из оригинала вболее пригодный для повторного использования и немного более разумный.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *extract_string(const char *str, const char s1, const char s2)
{
char *ret = NULL, *pos1 = NULL, *pos2 = NULL;
size_t len;
if (str == NULL || s1 < 0 || s2 < 0)
return NULL;
pos1 = strchr(str, s1);
pos2 = strchr(str, s2);
if (! pos1 || ! pos2)
return NULL;
len = ((pos2 - str) - (pos1 - str) - 1);
ret = (char *) malloc(len + 1);
if (ret == NULL)
return NULL;
memcpy(ret, str + (pos1 - str) + 1, len);
ret[len] = '\0';
return ret;
}
int main(void)
{
const char *string = "sip:12387654345443222118765@xxx.xxx.xxx.xxx";
char *buff = NULL;
buff = extract_string(string, ':', '@');
if (buff == NULL)
return 1;
printf("The string extracted from %s is %s\n" , string, buff);
free(buff);
return 0;
}
Вы можете легко изменить это, не заботясь о том, что второй разделитель не найден, и просто скопировать все справа от первого.Это упражнение для читателя.