如何在C语言中从一个包含字母、标点符号和数字的字符串中提取整数?

4

我有一个字符串看起来像这样“AGE:83”。我想从这个字符串中取出整数“83”,并且我知道我应该使用“sscanf”函数。然而,在这个字符串中没有空格。我应该怎么做?

1个回答

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个字符,这样做将导致未定义的行为,因为您可能会引用无效的地址。


考虑是否添加一个或多个%n转换符,以便了解匹配的起始位置和/或结束位置。 - Jonathan Leffler
2
这个解决方案非常好。如果你知道文本在年龄之前总是AGE:,那么你可以通过写sscanf(str, "AGE:%d", &age);来避免使用正则表达式。 - nicomp
2
如果您知道文本始终为“AGE:”,则可以执行以下操作:int age = atoi(str+4);,从而避免使用sscanf - Enzo Ferber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接