C99环境下sscanf返回异常求助:变量bb未正确赋值问题
嘿,我来帮你拆解这个sscanf的坑!你说aa能正常拿到6,但bb却得到未定义值,本该是1,这种情况大多是格式字符串和输入内容不匹配,或者变量处理有问题,我给你列几个最常见的原因:
格式字符串没匹配输入的分隔符
比如你的输入字符串可能是"aa=6,bb=1"或者"aa=6; bb=1"这种带逗号、分号的格式,但你写的sscanf格式字符串是"aa=%d bb=%d"——sscanf会严格按照格式串的规则匹配,遇到非空白的不匹配字符就会停止后续匹配。这时候aa匹配成功后,剩下的字符和格式串里的空格+bb=%d对不上,bb自然不会被赋值,保留未初始化的垃圾值。
解决办法:把格式串改成和输入匹配的样子,比如输入带逗号就写"aa=%d,bb=%d",或者用%*[ ,]来忽略任意逗号、空格这类分隔符:"aa=%d%*[ ,]bb=%d"。变量类型和格式符不对应
如果你把bb定义成了char bb;或者float bb;,但格式串里用了%d(对应int类型),这会导致sscanf写入内存的位置不对,bb的值就会变成乱七八糟的未定义值。一定要保证变量类型和格式符匹配:int用%d,char用%hhd,float用%f。输入字符串里根本没有bb的有效匹配项
比如输入字符串只有"aa=6",或者"aa=6 bb="(后面没数字),那sscanf找不到符合bb=%d的部分,就不会给bb赋值。这时候要检查输入内容是否完整包含了bb=1的结构。没提前初始化变量
如果你定义int aa, bb;后直接用sscanf,一旦匹配失败,变量会保留内存里的原始垃圾值。建议先给变量赋初始值,比如int aa=0, bb=0;,这样即使匹配失败,你也能立刻发现问题,而不是被未定义值误导。
举个正确的示例代码:
#include <stdio.h> int main() { int aa = 0, bb = 0; // 先初始化 // 假设输入字符串是带逗号的格式 sscanf("aa=6, bb=1", "aa=%d, bb=%d", &aa, &bb); printf("aa=%d, bb=%d\n", aa, bb); // 输出 aa=6, bb=1 return 0; }
内容的提问来源于stack exchange,提问作者Delphes

