You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改sscanf格式字符串以读取0至79长度的字符串?

让sscanf支持读取空字符串的格式方案

原代码中使用"\"%79[^\"]\""作为格式字符串时,sscanf无法匹配空字符串(即""),会返回0且不修改buf内容。我们需要找到一种方式,让sscanf既能读取0到79个字符的非引号字符串,又能在遇到空字符串时将buf设为'\0'并返回1。

原代码

#include <stdio.h>

int main(void) {
  char buf[80] = "salam";
  const char *fmt = "\"%79[^\"]\"";
  int n;

  n = sscanf("\"\"", fmt, buf);
  printf("%d fields were read. buf = '%s'\n", n, buf);
  n = sscanf("\"hamidi\"", fmt, buf);
  printf("%d fields were read. buf = '%s'\n", n, buf);
}

原运行输出

0 fields were read. buf = 'salam'
1 fields were read. buf = 'hamidi'

解决方案

由于sscanf的%[]格式默认要求至少匹配一个字符,无法直接匹配空字符串,我们可以结合%n记录匹配位置,手动处理空字符串的情况。修改后的代码如下:

#include <stdio.h>

int main(void) {
  char buf[80] = "salam";
  const char *fmt = "\"%n%79[^\"]%n\"";
  int n, start, end;

  // 处理空字符串
  n = sscanf("\"\"", fmt, &start, buf, &end);
  if (n == 0 && start == end) {
      buf[0] = '\0';
      n = 1;
  }
  printf("%d fields were read. buf = '%s'\n", n, buf);

  // 处理非空字符串
  n = sscanf("\"hamidi\"", fmt, &start, buf, &end);
  printf("%d fields were read. buf = '%s'\n", n, buf);
}

修改后运行输出

1 fields were read. buf = ''
1 fields were read. buf = 'hamidi'

说明

  • %n是sscanf的特殊格式,会将当前已读取的字符数写入对应的整数变量,不消耗输入内容。
  • 当输入为空字符串时,开头和结尾的"会被匹配,两个%n记录的位置相等,说明中间没有字符,此时手动将buf设为空字符串并把返回值修正为1。
  • 非空字符串会正常匹配%79[^\"],返回值保持为1,符合预期。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:33:18