You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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;
}

关键说明:

  1. 字面量逗号:格式字符串中的,会让sscanf自动匹配字段间的逗号,无需手动用%c读取,避免了字符匹配的意外。
  2. 长度限制%31[^,]表示最多读取31个非逗号字符(刚好适配drvrName[32]的空间,留1字节给字符串结束符\0);%7[^,]同理适配userPsswrd[8],防止缓冲区溢出。
  3. main函数规范:标准C要求main函数返回int类型,修改后更符合语言规范。

运行修改后的代码,就能得到你预期的输出:123456 , fariz 12345678

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

火山引擎 最新活动