当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何从C中提取带有混合字母,标点符号和整数的字符串中的整数?》经验,为你挑选了1个好方法。

我有一个看起来像"年龄:83"的字符串.我想从这个字符串中取整数"83",我知道我应该使用"sscanf"函数.但是,此字符串之间没有空格.我怎样才能做到这一点?



1> chqrlie..:

用这个:

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个字符,则会调用未定义的行为,因为您可能会取消引用无效地址.


解决方案很棒.如果您知道年龄之前的文本总是年龄:那么您可以通过编写sscanf(str,"AGE:%d",&age)来避免正则表达式;
@nicomp如果你知道文本总是"AGE:"`你可以这样做:`int age = atoi(str + 4);`并完全避免`sscanf`.
推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有