读取的字符串为csTemp = "SX020,三星-F619,6,,,1,2080,刷卡,,,,5,"
我想把第二个“,”第六个“,”和第九个“,”之前的字符段分别读到csName,csKongji,csBucha里面,如果没有则字符串为空
我用
sscanf(csTemp,"%*[^,],%[^,],%*[^,],%*[^,],%*[^,],%[^,],%*[^,],%*[^,],%[^,],%*s",csName,csKongji,csBucha);
调试发现csName,csKongji,csBucha三个字符串的都是“三星-F619”。csName,csKongji,csBucha,csTemp全部为CString变量。我将sName,csKongji,csBucha 换为 char [20] 结果相同。不知道什么原因,请指教。

解决方案 »

  1.   

    不好意思,问下,你是想实现这样的效果吗?
    csName = "SX020"
    csKongji = "三星-F619"
    csBucha = "6,,,1,2080,刷卡,,,,5"
      

  2.   

    不是,是想实现这样的效果:
    csName = "三星-F619"
    csKongji = "1"(第六个","前的数值)
    csBucha = ""(第九个","前的数值,因为这一行没有,所以为空)
      

  3.   

    是不是这样的格式
    Text1,Text2,Text3,Text4,...TextN,
    其中Text(n)可为空?
    然后读取Text(n)的值?
      

  4.   

    你先用sscanf读取整行,然后用strtok函数按逗号进行分割,这样你就可以按顺序读出每个逗号前面的字符串,再取出你想要的就字符串就可以了!
      

  5.   

    const char* pcstr = "Text1,Text2,Text3,Text4,...TextN"; 
    sscanf(pcstr, "%*[^,],"%s","%s",.....);
      

  6.   

    采用jastdoit的建议吧
    当你用%*[^,],来读取的时候
    _T("")无法得到
    也就是说,,,这种不会被认为是
    _T(""),_T(""),_T(""),
      

  7.   

    嗯,我也发现这个问题了。但是用jastdoit的建议无法知道是第几个“,”前的字符串,因为两个“,”之间有可能有字符也有可能没有。看来还要考虑一下别的方法。谢谢你的帮助!
      

  8.   

    可能strtok也没法,,的情况
    建议你采用CString::Find的方法,可以得出,的个数正确
    int nStart = 0;
    int nFind = 0;
    int nCount = 0;
    while(nFind != -1)
    {
    nStart = nFind+1;
    nFind = csTemp.Find(_T(","),nStart);
    nCount ++;
    }
    在这里做一下处理吧~
      

  9.   

    这是我处理的代码,调试可以。不知道有没有更简单的方法。 int iStart = 0;
    int iFind = 0;
    int iCount = 0;
    int iFindNext = csTemp.Find(",",iStart);
    while(iFindNext != -1)
    {
    iFind = iFindNext;
    iStart = iFind + 1;
    iFindNext = csTemp.Find(",",iStart);
    iCount ++;
    switch(iCount)
    {
    case 1:
    csName = csTemp.Left(iFindNext).Right(iFindNext-iFind-1);
    break;
    case 5:
    csKongji = csTemp.Left(iFindNext).Right(iFindNext-iFind-1);
    break;
    case 8:
    csBucha = csTemp.Left(iFindNext).Right(iFindNext-iFind-1);
    break;
    }
    }