【发布时间】:2014-03-28 19:32:27
【问题描述】:
我正在尝试读取一个字符串,该字符串由一组数字和一个字符串组成,并用一些其他基本文本包裹。
换句话说,行的格式是这样的:
Stuff<5,10,-5,8,"Test string here.">
天真地,我试过了:
sscanf(str,"Stuff<%d,%d,%d,%d,\"%s\">",&i1,&i2,&i3,&i4,str2);
但经过一些研究,我发现%s 在遇到空白字符时应该停止解析。我找到了this question,但没有一个答案能解决我遇到的问题:字符串中可以包含任何字符,包括换行符和正确转义的引号。后者不是问题,如果我可以让 sscanf 将所有内容放在我提供的预分配缓冲区中的第一个引号之后,我可以自己剥离结尾。
但是我该怎么做呢?我不能使用%[],因为它需要其中的一些东西来终止字符串,而我唯一想要终止它的是空终止符。所以我想,“嘿,我只使用空终止符!”但是%[\0] 让编译器脾气暴躁:
warning: no closing ‘]’ for ‘%[’ format
warning: embedded ‘\0’ in format
warning: no closing ‘]’ for ‘%[’ format
warning: embedded ‘\0’ in format
使用%*c 之类的东西也不起作用,因为我不知道需要提取多少个字符。我尝试传递strlen(str),因为它会小于那个值,但是sscanf 返回4,并且没有任何东西放入str2,这表明可能是因为长度太长而放弃并且没有打扰。
更新:我想我可以这样做:
sscanf(str,"Stuff<%d,%d,%d,%d,\"%n",&i1,&i2,&i3,&i4,&n);
str2 = str+n;
【问题讨论】: