gcc 4.4.3 C89
我有以下字符串
sip:12387654345443222118765@xxx.xxx.xxx.xxx
如何只提取数字?我只想要这个号码。
12387654345443222118765
非常感谢任何建议,
答案 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;
}
您可以轻松修改它,不在乎是否找不到第二个分隔符,只需将所有内容复制到第一个分隔符的右侧。这对读者来说是一种练习。