int scanf_buffer_2_step(const char * buffer) {
int i;
double d;
// Initialize to a value that a successful scan would never use.
int n = -1;
// append vv vv
sscanf(buffer, "Index:%d,%n", &i, &n);
// Test for success
if (n < 0) return 1; // fail
// Advance pointer to next string position
buffer += n;
// Do it some more
n = -1;
sscanf(buffer, " Data:%lf End of the line %n", &d, &n);
if (n < 0) return 1; // fail
buffer += n; // Advance pointer to next string position
if (buffer[0] != '\0') return 1; // fail (extra data)
printf("(%i %f)", i, d);
return 0;
}
int main(void) {
printf("%d\n", scanf_buffer_2_step("Index:1, Data:123.456 End of the line"));
printf("%d\n", scanf_buffer_2_step("Index:1, Data:123.456 End of the line extra"));
printf("%d\n", scanf_buffer_2_step("Index:1,"));
return 0;
}
4 回答
在简单的情况下,您可以使用
"%n"
说明符,就像这样现在
length
将在字符串中具有“位置”,以便下次可以从那里继续在更复杂的情况下,您可能需要的不仅仅是
sscanf()
,或者取决于您所使用的平台fmemopen(3),因此您可以使用fscanf()
,同时拥有您希望的字符串并与之交互,就好像它是一个文件一样 .C字符串没有当前访问位置的概念,除非您在外部提供 . 因此,
sscanf()
的任何变体都不能考虑固有的当前访问位置 . 原则上,可能有一个变量接受起始位置作为附加参数,但这将是多余的,因为正如@MichaelWalz所观察到的,您可以使用常规指针算法来实现sscanf()
本身 .不,没有't. You' ll必须跟踪从字符串中偏移多少并在调用
sscanf
时使用它 .要跟踪偏移量,可以使用
%n
格式说明符让sscanf
告诉您消耗的字符数 .使用
"%n
是处理扫描前一部分扫描完成的字符串的常用方法,因为"%n"
记录扫描到该点的偏移量 .将其附加到格式的末尾并测试索引值是否从-1更改 . 这适用于简单和复杂的格式 .
产量
对于最终扫描,如果在字符串末尾允许使用
'\n'
,则考虑添加" %n"
.对于
fscanf()
,还会出现问题,例如检查EOF
的返回值 .