scanf / sscanf:安全输入与字符串解析
2026/8/23大约 1 分钟
scanf / sscanf:安全输入与字符串解析
scanf 和 sscanf 的核心区别:
scanf
→ 从标准输入读取
sscanf
→ 从已有字符串中解析一、sscanf 的参数
sscanf(input, "%31s", buf);可以理解成:
sscanf(从哪里读, 按什么格式读, 结果放哪里)例如:
char input[] = "hello world";
char buf[32];
sscanf(input, "%31s", buf);结果:
buf → "hello"%s 遇到空格就停止。
二、限制 %s 的长度
char buf[32];
sscanf(input, "%31s", buf);最多读取:
31 个字符 + '\0'不要写:
sscanf(input, "%s", buf); // ❌否则输入过长可能造成缓冲区溢出。
同样:
scanf("%31s", buf);也比:
scanf("%s", buf); // ❌安全。
三、检查返回值
sscanf 返回成功解析并赋值的项目数。
int a, b;
if (sscanf(str, "%d,%d", &a, &b) != 2)
{
// 解析失败
}例如:
"123,456" → 2
"123,abc" → 1
"abc,456" → 0因此:
使用
scanf/sscanf后,不要忽略返回值。
四、解析带空格的字符串
sscanf(str, "%31s", buf);遇到空格会停止。
需要读取整段字符串:
sscanf(str, "%31[^\n]", buf);实际工程中通常更推荐:
fgets(buf, sizeof(buf), stdin);五、嵌入式中的典型用途
例如解析 AT 指令响应:
char resp[] = "+CSQ: 25,99";
int rssi;
int ber;
if (sscanf(resp, "+CSQ: %d,%d", &rssi, &ber) == 2)
{
// 解析成功
}这里:
resp
↓
"%d,%d"
↓
&rssi、&ber就是:
从字符串中按固定格式提取数据。
六、最终记忆
scanf
→ 标准输入 → 变量
sscanf
→ 字符串 → 变量安全使用:
① %s 限制长度
② 检查返回值
③ 含空格的字符串不要直接用 %s
sscanf(str, format, ...):从str按format解析,把结果写入后面的变量。

