我想从该字符串中获取子字符串:
“ 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(不正确)
szB:NULL
并且另一个参数的值也不正确!
我不知道为什么会这样?
请告诉我原因。
最佳答案
如果打算将Stabaek
存储在szA
中,则需要排除'
,因为它不被视为%s
格式的定界符。从C标准的格式s
:
匹配一系列非空格字符。
要排除将%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/