怎么拆分字符串

cbzjzsb123 2013-01-09 11:03:16
有一个字符串,中间是用/分开的,我怎么能把两个/之间的字符串提取出来。
比如说
String 0/Mfdas-S01/V0001/M4GH2118//MERW-2011-12-00017///*
我想让CString str1=Mfdas-S01,str2=V0001
...全文
297 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
wodetongheai 2013-01-13
  • 打赏
  • 举报
回复
赵老师正解,sscanf最方便了!
乔巴好萌 2013-01-13
  • 打赏
  • 举报
回复
如果用Qt的话 QString有个方法就是split C++标准库里没有这个实现 需要自己实现
fukainankai 2013-01-11
  • 打赏
  • 举报
回复
一分十几秒把代码co出来,略牛逼额,虽然我也能写出来估计少说得十来分钟,回家洗洗睡了。
mymtom 2013-01-11
  • 打赏
  • 举报
回复
strtok/strsep/split(boost)
HayYoung 2013-01-11
  • 打赏
  • 举报
回复
写一个,不需要考虑内存释放的。

#include <atlstr.h>
#include <vector>

std::vector<CString>& split(const CString& str, const TCHAR * delim, std::vector<CString> &elems)
{
	CString resToken;
	int curPos = 0;

	resToken= str.Tokenize(delim,curPos);
	while (resToken != _T(""))
	{
		elems.push_back(resToken);	
		resToken = str.Tokenize(delim, curPos);
	};
	return elems;
}

int main()
{
	CString str = _T("String 0/Mfdas-S01/V0001/M4GH2118//MERW-2011-12-00017///*");
	std::vector<CString> v;
	split(str, _T("/"), v);
	//v[1],v[2]......就是分割好的字符串
}
赵4老师 2013-01-11
  • 打赏
  • 举报
回复
#include <afxdisp.h>
#include <stdio.h>
int main() {
    CString str="0/Mfdas-S01/V0001/M4GH2118//MERW-2011-12-00017///*";
	char cs1[40],cs2[40];
    CString str1,str2;

    sscanf(str,"%*[^/]/%[^/]/%[^/]",cs1,cs2);
	str1=cs1;
	str2=cs2;
    printf("str1==[%s],str2==[%s]\n",str1,str2);
    return 0;
}
//str1==[Mfdas-S01],str2==[V0001]
chenpengyu86 2013-01-11
  • 打赏
  • 举报
回复
1 #include <cstring> 2 #include <iostream> 3 using namespace std; 4 5 const char* strtok(const char* p, char buf[], char split) { 6 while (*p == split) 7 ++p; 8 int i = 0; 9 while (*p != '\0' && *p != split) { 10 buf[i++] = *p; 11 ++p; 12 } 13 buf[i] = '\0'; 14 return p; 15 } 16 17 int main() { 18 const char* str = "/home/chenp/workspace/"; 19 char buf[100]; 20 while ((*(str = strtok(str, buf, '/'))) != '\0') { 21 cout << string(buf) << endl; 22 } 23 }
jimette 2013-01-10
  • 打赏
  • 举报
回复
引用 8 楼 cbzjzsb123 的回复:
第一个我没看懂,别人帮我写了一个,能用了。我放上来给你们共享下吧。 C/C++ code?1234567891011121314151617181920212223242526272829303132333435363738394041424344//分离字符串CString * SplitString(CString str, char split, int&……
你stl看不懂?!
xwb2766 2013-01-10
  • 打赏
  • 举报
回复
这种事情最好交给正则表达式去做吧 自己写总会有想不到的情况的
bm425 2013-01-10
  • 打赏
  • 举报
回复
CString str="0/Mfdas-S01/V0001/M4GH2118//MERW-2011-12-00017///*" CString str1,str2,str3,str4,str5,str6 可以用sscanf(str,"%s/%s/%s/%s//%s///%s",str1,str2....);
zhcosin 2013-01-10
  • 打赏
  • 举报
回复
用 sscanf 函数
rickys2080 2013-01-10
  • 打赏
  • 举报
回复
遇到'\'就new一个新字符串来接收
prajna 2013-01-09
  • 打赏
  • 举报
回复
簡單的用sscanf就行.
cbzjzsb123 2013-01-09
  • 打赏
  • 举报
回复
哈哈,真给力,一来就上源码,我先看看,看懂了立即把分给你。
十八道胡同 2013-01-09
  • 打赏
  • 举报
回复


StringArray StdHelper::splitLine(string inLine, string inDelims)
{
	// See the comments for the wstring version of splitLine

	StringArray outWords;
    
    string::size_type n = inLine.length();
    if (n!=0)
	{
		string::size_type start, stop;
		
		start = inLine.find_first_not_of(inDelims);

		while (start != string::npos && start < n)
		{
			stop = inLine.find_first_of(inDelims, start);

			if (stop == string::npos || stop > n)
				stop = n;

			if (*(inLine.begin()+start) == '\0')
				break;

			outWords.push_back(inLine.substr(start, stop-start));

			start = inLine.find_first_not_of(inDelims, stop+1);

		}
	}
	return outWords;
}

cbzjzsb123 2013-01-09
  • 打赏
  • 举报
回复
第一个我没看懂,别人帮我写了一个,能用了。我放上来给你们共享下吧。
//分离字符串
CString * SplitString(CString str, char split, int& iSubStrs)
{
    int iPos = 0; //分割符位置
    int iNums = 0; //分割符的总数
    CString strTemp = str;
    CString strRight;
    //先计算子字符串的数量
    while (iPos != -1)
    {
        iPos = strTemp.Find(split);
        if (iPos == -1)
        {
            break;
        }
        strRight = strTemp.Mid(iPos + 1, str.GetLength());
        strTemp = strRight;
        iNums++;
    }
    if (iNums == 0) //没有找到分割符
    {
        //子字符串数就是字符串本身
        iSubStrs = 1; 
        return NULL;
    }
    //子字符串数组
    iSubStrs = iNums + 1; //子串的数量 = 分割符数量 + 1
    CString* pStrSplit;
    pStrSplit = new CString[iSubStrs];
    strTemp = str;
    CString strLeft;
    for (int i = 0; i < iNums; i++)
    {
        iPos = strTemp.Find(split);
        //左子串
        strLeft = strTemp.Left(iPos);
        //右子串
        strRight = strTemp.Mid(iPos + 1, strTemp.GetLength());
        strTemp = strRight;
        pStrSplit[i] = strLeft;
    }
    pStrSplit[iNums] = strTemp;
    return pStrSplit;
}
我是这样用的

CString str;
	PRRect.ProcCode2(str,CRect(0,0,640,480));
	CWnd* wnd=GetDlgItem(IDC_EDIT_CODE2);
	wnd->SetWindowText(str);

	int max;
	CString* strResult;
	strResult = SplitString(str,'/',max);

	if (strResult == NULL)
	{
		return ;
	}
	GetDlgItem(IDC_EDIT_TYPE)->SetWindowText(strResult[1]);	
	GetDlgItem(IDC_EDIT_VERSION)->SetWindowText(strResult[2]);	
	GetDlgItem(IDC_EDIT_SN)->SetWindowText(strResult[3]);	
	GetDlgItem(IDC_EDIT_DATE)->SetWindowText(strResult[5]);
现在是能用了,不知道这样做会不回出什么错。
赵4老师 2013-01-09
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <string.h>
char string[80];
char seps1[3];
char seps2[3];
char *token;
char *zzstrtok (
    char *string,
    const char *control1,//连续出现时视为中间夹空token
    const char *control2 //连续出现时视为中间无空token
    )
{
    unsigned char *str;
    const unsigned char *ctrl1 = (const unsigned char *)control1;
    const unsigned char *ctrl2 = (const unsigned char *)control2;
    unsigned char map1[32],map2[32];
    static char *nextoken;
    static char flag=0;
    unsigned char c;
    int L;

    memset(map1,0,32);
    memset(map2,0,32);
    do {
        map1[*ctrl1 >> 3] |= (1 << (*ctrl1 & 7));
    } while (*ctrl1++);
    do {
        map2[*ctrl2 >> 3] |= (1 << (*ctrl2 & 7));
    } while (*ctrl2++);

    if (string) {
        if (control2[0]) {
            L=strlen(string);
            while (1) {
                c=string[L-1];
                if (map2[c >> 3] & (1 << (c & 7))) {
                    L--;
                    string[L]=0;
                } else break;
            }
        }
        if (control1[0]) {
            L=strlen(string);
            c=string[L-1];
            if (map1[c >> 3] & (1 << (c & 7))) {
                string[L]=control1[0];
                string[L+1]=0;
            }
        }
        str=(unsigned char *)string;
    }
    else str=(unsigned char *)nextoken;

    string=(char *)str;
    while (1) {
        if (0==flag) {
            if (!*str) break;
            if (map1[*str >> 3] & (1 << (*str & 7))) {
                *str=0;
                str++;
                break;
            } else if (map2[*str >> 3] & (1 << (*str & 7))) {
                string++;
                str++;
            } else {
                flag=1;
                str++;
            }
        } else if (1==flag) {
            if (!*str) break;
            if (map1[*str >> 3] & (1 << (*str & 7))) {
                *str=0;
                str++;
                flag=0;
                break;
            } else if (map2[*str >> 3] & (1 << (*str & 7))) {
                *str=0;
                str++;
                flag=2;
                break;
            } else str++;
        } else {//2==flag
            if (!*str) return NULL;
            if (map1[*str >> 3] & (1 << (*str & 7))) {
                str++;
                string=(char *)str;
                flag=0;
            } else if (map2[*str >> 3] & (1 << (*str & 7))) {
                str++;
                string=(char *)str;
            } else {
                string=(char *)str;
                str++;
                flag=1;
            }
        }
    }
    nextoken=(char *)str;

    if (string==(char *)str) return NULL;
    else             return string;
}
void main()
{
   strcpy(string,"A \tstring\t\tof ,,tokens\n\nand some  more tokens, ");
   strcpy(seps1,",\n");strcpy(seps2," \t");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,"1234| LIYI|China | 010 |201110260000|OK");
   strcpy(seps1,"|");strcpy(seps2," ");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,"1234|LIYI||010|201110260000|OK");
   strcpy(seps1,"");strcpy(seps2,"|");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,"1234|LIYI||010|201110260000|OK");
   strcpy(seps1,"|");strcpy(seps2,"");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,"a");
   strcpy(seps1,",");strcpy(seps2,"");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,"a,b");
   strcpy(seps1,",");strcpy(seps2,"");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,"a,,b");
   strcpy(seps1,",");strcpy(seps2,"");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,",a");
   strcpy(seps1,",");strcpy(seps2,"");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,"a,");
   strcpy(seps1,",");strcpy(seps2,"");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,",a,,b");
   strcpy(seps1,",");strcpy(seps2,"");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,",,a,,b,,");
   strcpy(seps1,",");strcpy(seps2,"");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,",");
   strcpy(seps1,",");strcpy(seps2,"");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,",,");
   strcpy(seps1,",");strcpy(seps2,"");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }

   strcpy(string,",,,");
   strcpy(seps1,",");strcpy(seps2," ");
   printf("\n[%s]\nTokens:\n",string);
   token=zzstrtok(string,seps1,seps2);
   while (token!=NULL) {
      printf(" <%s>",token);
      token=zzstrtok(NULL,seps1,seps2);
   }
}
//
//[A      string          of ,,tokens
//
//and some  more tokens,]
//Tokens:
// <A>, <string>, <of>, <>, <tokens>, <>, <and>, <some>, <more>, <tokens>, <>,
//[1234| LIYI|China | 010 |201110260000|OK]
//Tokens:
// <1234>, <LIYI>, <China>, <010>, <201110260000>, <OK>,
//[1234|LIYI||010|201110260000|OK]
//Tokens:
// <1234>, <LIYI>, <010>, <201110260000>, <OK>,
//[1234|LIYI||010|201110260000|OK]
//Tokens:
// <1234>, <LIYI>, <>, <010>, <201110260000>, <OK>,
//[a]
//Tokens:
// <a>,
//[a,b]
//Tokens:
// <a>, <b>,
//[a,,b]
//Tokens:
// <a>, <>, <b>,
//[,a]
//Tokens:
// <>, <a>,
//[a,]
//Tokens:
// <a>, <>,
//[,a,,b]
//Tokens:
// <>, <a>, <>, <b>,
//[,,a,,b,,]
//Tokens:
// <>, <>, <a>, <>, <b>, <>, <>,
//[,]
//Tokens:
// <>, <>,
//[,,]
//Tokens:
// <>, <>, <>,
//[,,,]
//Tokens:
// <>, <>, <>, <>,
ak_ing 2013-01-09
  • 打赏
  • 举报
回复
strtok函数,以前以为只有java有现成的split函数可以分割,没想到C++也有啊。学习了!
东大坡居士 2013-01-09
  • 打赏
  • 举报
回复
zslInSz 2013-01-09
  • 打赏
  • 举报
回复
	const char * split = "<>";
	char p[100]={0/Mfdas-S01/V0001/M4GH2118//MERW-2011-12-00017///*}; 
	pstr = strtok (p,split); 
	while(pstr!=NULL) {
		strcpy(ptemp[SpiltNum],pstr);
//		printf ("%s\n",pstr);
		SpiltNum++;
		pstr = strtok(NULL,split); 
	}
这样分割取出指针就ok了,然后copy
加载更多回复(1)

64,318

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧