c - 分割参数

标签 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

另外一个参数的值也不正确!

我不知道为什么会发生这种情况?

请告诉我原因。

最佳答案

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

Matches a sequence of non-white-space characters.

排除更改 %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. */
    }
    

关于c - 分割参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11824802/

相关文章:

C 位级整数到浮点转换意外输出

c++ - 不关心 scanf

C sscanf 精确长度

c - 循环重复 printf 但不重复 scanf

arrays - C 中函数参数中的固定数组或指针之间的区别?

jquery - Phonegap iOS6 : Proper solution to Remove form assistant bar (prev, 接下来,完成)

c - 套接字:过早断开连接

c - 在 C 中,如何将字符串转换为字符数组?

c - 使用 fscanf 读入指针时出现段错误(核心转储)

c - scanf() 将换行符保留在缓冲区中