0

我想从此字符串中获取子字符串:

"1,26,[1076168,'Stabaek','Branna','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','Branna','1.021',10,'08/07/2012(不正确)

szB:空

并且其他参数的值也不正确!

我不知道为什么会这样?

请告诉我原因。

4

1 回答 1

2

如果打算存储StabaekszA那么您需要排除 ,'因为它不被视为%s格式的分隔符。来自格式的 C 标准s

匹配一系列非空白字符。

排除更改%s%[^']

swscanf( szTemp , L"%d,%d,[%d,\'%[^']', ... ");

一些建议:

  • 限制读入 a 的字符数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. */
    }
    
于 2012-08-06T08:36:00.473 回答