извлечь строковое значение из строки - PullRequest
2 голосов
/ 19 июня 2010

gcc 4.4.3 c89

У меня есть следующая строка

sip:12387654345443222118765@xxx.xxx.xxx.xxx

Как мне извлечь только число?Я просто хочу номер.

12387654345443222118765

Большое спасибо за любой совет,

Ответы [ 5 ]

5 голосов
/ 19 июня 2010

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

Вот еще один метод, который ищет непрерывную последовательность цифр:

char *start = sipStr + strcspn(sipStr, "0123456789");
int len = strspn(start, "0123456789");

char *copy = malloc(len + 1);

memcpy(copy, start, len);
copy[len] = '\0'; //add null terminator

...
//don't forget to
free(copy);
4 голосов
/ 19 июня 2010

Звучит так, будто вы хотите использовать его как числовой тип, что будет сложно (он слишком велик, чтобы поместиться в int или long).Теоретически вы можете просто сделать:

const char* original = "sip:12387654345443222118765@xxx.xxx.xxx.xxx";
long num = strtoul(original + 4, NULL, 10);

, но оно переполнится и strtoul вернет -1.Если вы хотите, чтобы она была в виде строки, и вы знаете, что она всегда будет такой точной длины, вы можете просто извлечь подстроку с помощью strcpy / strncpy:

const char* original = "sip:12387654345443222118765@xxx.xxx.xxx.xxx";
char num[24];
strncpy(num, original + 4, 23);
num[23] = 0;

Если вы не знаетекаждый раз он будет состоять из 23 символов, сначала вам нужно найти знак @ в исходной строке:

unsigned int num_length = strchr(original, '@') - (original + 4);
char* num = malloc(num_length + 1);
strncpy(num, original + 4, num_length);
num[num_length] = 0;
2 голосов
/ 19 июня 2010

Используйте регулярное выражение:)

#include <regex.h>
regcomp() // compile your regex
regexec() // run your regex
regfree() // free your regex

:)

1 голос
/ 19 июня 2010

Вот кое-что, что будет иметь дело с подстрокой переменной ширины, которая не заботится о начальной позиции подстроки.Например, если строка была 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;
}

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

1 голос
/ 19 июня 2010

Посмотрите на функции strtok или strtok_r.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...