从字符串中提取字符串值

时间:2010-06-19 07:31:57

标签: c

gcc 4.4.3 C89

我有以下字符串

sip:12387654345443222118765@xxx.xxx.xxx.xxx

如何只提取数字?我只想要这个号码。

12387654345443222118765

非常感谢任何建议,

5 个答案:

答案 0 :(得分:5)

有很多方法可以做到这一点,如果字符串格式正确,您可以使用strchr()搜索:并再次使用strchr()来搜索{{ 1}}并把它们之间的所有东西都拿走。

这是另一种寻找连续数字序列的方法:

@

答案 1 :(得分:4)

听起来你想要它作为一种数字类型,这将是困难的(它太大而不适合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 :(得分:2)

使用正则表达式:)

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

:)

答案 3 :(得分:1)

查看strtok或strtok_r函数。

答案 4 :(得分:1)

这是处理可变宽度子字符串的东西,它不关心子字符串的起始位置。例如,如果字符串是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;
}

您可以轻松修改它,不在乎是否找不到第二个分隔符,只需将所有内容复制到第一个分隔符的右侧。这对读者来说是一种练习。