C语言sscanf无法解析字符串问题求助
问题分析与解决方案
你的问题出在sscanf格式字符串的写法上——虽然逻辑上你想用%c读取分隔逗号,但这种写法不够健壮,而且可能因为字符匹配的细节问题导致drvrName没有被正确赋值。
为什么会出现这个问题?
当%d读取完123456后,%c确实会读取紧跟的逗号,但接下来的%[^,]理论上应该读取fariz直到下一个逗号。不过如果遇到某些隐式的匹配问题(比如编译器对字符串解析的微小差异,或者格式字符串的疏漏),就会导致%[^,]匹配失败,drvrName保持初始的全0状态,自然输出为空。
更关键的是,用%c手动读取逗号的写法没必要,反而容易引入意外问题——因为%c会读取任何字符(包括空格、换行等),如果字符串中出现意料之外的空白字符,就会直接打乱解析流程。
修复方案
直接在格式字符串中使用字面量逗号作为分隔符,让sscanf自动匹配字段间的逗号,同时为%[^,]加上长度限制避免缓冲区溢出:
#include <stdio.h> int main(){ // 标准C中main返回类型应为int,而非void char driver_list[128] = {"123456,fariz,12345678,012-345-6789\n" "234567,山田花子,23456789,012-345-6789\n"}; int drvrId; char drvrName[32] = {0}, userPsswrd[8]; // 修改格式字符串,用字面量逗号分隔,加上长度限制 sscanf(driver_list, "%d,%31[^,],%7[^,]", &drvrId, drvrName, userPsswrd); printf("\n %d , %s %s\n", drvrId, drvrName, userPsswrd); return 0; }
关键说明:
- 字面量逗号:格式字符串中的
,会让sscanf自动匹配字段间的逗号,无需手动用%c读取,避免了字符匹配的意外。 - 长度限制:
%31[^,]表示最多读取31个非逗号字符(刚好适配drvrName[32]的空间,留1字节给字符串结束符\0);%7[^,]同理适配userPsswrd[8],防止缓冲区溢出。 - main函数规范:标准C要求
main函数返回int类型,修改后更符合语言规范。
运行修改后的代码,就能得到你预期的输出:123456 , fariz 12345678
内容的提问来源于stack exchange,提问作者fariz




