我想从这个字符串中获取子字符串:
“1,26,[1076168,'Stabaek','Brann','1.021',10,'08 / 07/2012 01:00','',0,0,1,6],[ [19,23,[]],[14148266,[1,0,1,0,5000,-0.50,19001],[ - 0.95,0.87]],[14166487,[1,0,1,0,2000 ,-0.25,19001],[ - 0.72,0.64]],[14148270,[5,0,5,0,2000,0.00,19001],[3.90,3.50,1.86]],[14166491,[1,0 ,1,0,3000,-0.75,19001],[0.80,-0.88]]],2"
所以我这样称为swscanf函数!
swscanf( szTemp , L"%d,%d,[%d,\'%s\',\'%s\',\'%s\',%d,\'%s\',\'\',%d,%d,%d,%d],,[%s],%d" , &n1 , &n2 , &n3 , szA , szB , szT1 , &n4 , szTime , &n5 , &n6 , &n7 , &n8 , szThird , &n9);
结果是:
n1: 1 n2: 26 n3: 1076168 szA: Stabaek','Brann','1.021',10,'08/07/2012 ( Incorrect) szB: NULL
,其他参数的值也不正确!
我不知道为什么会这样?
请告诉我原因。
答案 0 :(得分:2)
如果打算将Stabaek
存储在szA
中,则需要排除'
,因为它不被视为%s
格式的分隔符。来自格式s
的C标准:
匹配一系列非空白字符。
要将更改%s
排除到%[^']
:
swscanf( szTemp , L"%d,%d,[%d,\'%[^']', ... ");
一些建议:
对读入char[]
的字符数设置限制以避免缓冲区溢出(以下示例中为32,请记住留空以终止null):
swscanf( szTemp , L"%d,%d,[%d,\'%32[^']', ... ");
检查swscanf()
的返回值。它返回成功分配的数量。在发布的代码中,正在请求14个分配,因此返回值应为14(如果要求所有分配都存在);
if (14 == swscanf(...))
{
/* All good. */
}
使用%n
格式说明符来确定输入缓冲区的处理点。我发现这对检查整个缓冲区是否已处理很有用(如果预期整个缓冲区都要处理):
int pos;
if (14 == swscanf(szTemp, "....%n", ...., &pos) &&
pos == wcslen(szTemp))
{
/* All assignments made and processed entire buffer. */
}