使用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
相关产品推荐
相关产品推荐

