拆分参数来自

时间:2012-08-06 08:25:50

标签: c scanf

我想从这个字符串中获取子字符串:

  

“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

,其他参数的值也不正确!

我不知道为什么会这样?

请告诉我原因。

1 个答案:

答案 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. */
    }