我想从此字符串中获取子字符串:
"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
另外一个参数的值也不正确!
我不知道为什么会发生这种情况?
请告诉我原因。
最佳答案
如果目的是存储 Stabaek
在szA
那么你需要排除 '
因为它不被视为 %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/