如何修改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
相关产品推荐
相关产品推荐

