我有一个很长的字符串需要读入,数据长度的内容是不确定的,但格式已知。比如字符串如下:
“TYPE=3, Degree=2, CtrlPtCount=7,knots=[9424.777961,9424.777961,9424.777961,12566.370614,12566.370614,15707.963268,15707.963268,18849.555922,18849.555922,18849.555922]”我的读取代码int DMType, nDegree, nCtrlCount;
str += sscanf_s(str, "TYPE=%d, Degree=%d, CtrlPtCount=%d,", &DMType,    &nDegree,  &nCtrlCount);//这时只移动了三个字符,不对//读取节点向量
str += sscanf_s(str, "knots=["); 
int KnotsLen = nDegree+nCtrlCount+1;
double* Knots = new double[KnotsLen];
int i;
for (i = 0; i<KnotsLen-1; i++)
{
   str += sscanf_s(str, "%lf,", &Knots[i]);//这时移动也不对
 }
   str += sscanf_s(str, "%lf]", &Knots[i]); //这时只移动也不对问题的原因找到了,是因为sscanf_s函数的返回值不是读取字符串的长度,是读取的数据的项数。怎么才能让str读取后,移动到未读取的地方呢?

解决方案 »

  1.   

    用sscanf_s一次读完你要好好看函数说明,sscanf_s的返回值是成功转换的标记数,sscanf_s(str, "TYPE=%d, Degree=%d, CtrlPtCount=%d,", &DMType, &nDegree, &nCtrlCount)这句转换了DMType, nDegree, nCtrlCount这三个,所以返回3
      

  2.   

    既然字符串格式已知,那么就最好一次性把各个字段的数据都sscanf_s读入你的各个变量.
      

  3.   

    如何用sscanf_s一次读完,那些参数如何一次性输入,请给个例子? 还有,如果数据量很大,可能会有上万个,会不会把栈破坏掉?
      

  4.   

    我觉得还是先用","隔开,再分别sscanf比较靠谱
    CString strSrc=“TYPE=3, Degree=2, CtrlPtCount=7,knots=[9424.777961,9424.777961,9424.777961,12566.370614,12566.370614,15707.963268,15707.963268,18849.555922,18849.555922,18849.555922]”;
    int pos;
    CString strTmp;
    while(-1 != (pos=strSrc.Find(',',0)))
    {
        strTmp=strSrc.Left(pos);
        sscanf_s(...);
        strSrc=strSrc.Right(strSrc.GetLength()-pos-1);
    }