You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C语言sscanf无法提取字符串中第二个整数的问题排查

问题分析与解决方案

嘿,我来帮你排查这个sscanf的问题~

首先看你的输出,第二个整数读出来是0,这说明sscanf根本没成功读取到456,问题出在你写的格式字符串逻辑上。我们一步步拆解你的代码执行过程:

你的原字符串是 "123asdrZXC456",格式串是 "%d %[^a-z] %[^A-Z] %d":

  • 第一个%d顺利读取了123,此时字符串指针移动到了小写字母a的位置。
  • 格式串里的空格会跳过任意空白字符(这里没有空白,所以直接进入下一个转换)。
  • 接下来的%[^a-z]是匹配所有非小写字母的字符序列,但当前指针位置就是小写字母a,没有符合条件的字符,这个转换直接失败。后续的%[^A-Z]和%d都不会再执行,num2因为没被赋值,输出的是未初始化的默认值(刚好是0)。

修正方案

根据你的需求(提取两个整数+中间的小写/大写字母),把格式串里的反集转换符改成正集即可:

#include <stdio.h>

int main() {
    char str[100] = "123asdrZXC456";
    char lowercase[100];
    char uppercase[100];
    int num1;
    int num2;
    // 用正集匹配小写、大写字母,去掉多余空格(原字符串无空格)
    sscanf(str,"%d%[a-z]%[A-Z]%d", &num1, lowercase, uppercase, &num2);
    printf("The number is: %d.\n", num1);
    printf("The number is: %d.\n", num2);
    printf("Lowercase: %s\n", lowercase);
    printf("Uppercase: %s\n", uppercase);
    return 0;
}

执行后就能得到正确的输出:

The number is: 123.
The number is: 456.
Lowercase: asdr
Uppercase: ZXC

额外优化

为了避免缓冲区溢出(比如字母部分过长超过数组长度),建议在%[转换符里指定最大匹配长度(数组长度-1,留位置存字符串结束符\0):

sscanf(str,"%d%99[a-z]%99[A-Z]%d", &num1, lowercase, uppercase, &num2);

如果你的需求只是提取两个整数,不需要中间的字母,还可以更简洁:

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

这里的%*[^0-9]表示匹配所有非数字字符,并用*忽略匹配结果,直接跳过中间的字母部分,读取第二个整数。

内容的提问来源于stack exchange,提问作者user3741679

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:45:01