如何从C中提取带有混合字母,标点符号和整数的字符串中的整数?

时间:2016-07-23 23:21:48

标签: c parsing

我有一个看起来像" AGE:83"的字符串。我想取整数" 83"超出这个字符串,我知道我应该使用" sscanf"功能。但是,此字符串之间没有空格。我怎么能这样做?

1 个答案:

答案 0 :(得分:6)

使用此:

const char *str = "AGE:83";
int age;

sscanf(str, "%*[^0-9]%d", &age);

此格式将跳过任何非数字并在此之后解析整数。

请注意,如果号码前没有非数字字符,则会失败。要处理数字可以在字符串开头的情况,请先使用直接匹配:

if (sscanf(str, "%d", &age) != 1
&&  sscanf(str, "%*[^0-9]%d", &age) != 1) {
    // no number found;
    return 1;
}
// age was correctly extracted from `str`

无法以这种方式解析负数,除非您知道前缀不包含'-'(使用格式"%*[^0-9-]%d"

您还可以使用字符串函数跳过前缀并转换atoi()strtol()的其余部分:

age = atoi(str + strcspn(str, "0123456789"));

正如Enzo Ferber所说,如果字符串的格式是固定的并且已知以AGE:开头,则可以将字符串的其余部分转换为:

age = atoi(str + 4);

但如果字符串短于4个字符,则会调用未定义的行为,因为您可能会取消引用无效地址。