C++字符串处理
假设有这样的一个字符串:
CString str = "AA,3,1,2"
现在定义了如下一些变量:
char *name;
int a;
int b;
int c;
我想把str的内容以","分解成如下格式并且赋值给相应的变量
得到的结果如下
我该怎么做??
name = "AA"
a = 3;
b = 1;
c = 2;
希望C++高手指点下
谢谢了啊~~~
[解决办法]
To 楼上:是CString 不是string,所以没有find_first_of方法可用
CString temp;
int pos = 0;
int tmp = 0;
vector<CString> v_str;
while(pos!=-1)
{
pos = str.Find(",",pos);
temp = str.Mid(tmp,pos-tmp);
v_str.push_back(temp);
}
CString用的不熟,大概这样就可以将字符拆分开,然后该怎么转怎么转了.
[解决办法]
TO 楼上 find_first_of 是乏型算法
[解决办法]
char* p = "AA,1,2,3";
char name[64] = {0};
int a, b, c;
sscanf(p, "%[^,],%d,%d,%d", name, &a, &b, &c);
[解决办法]
给楼主一段我的代码,经多方测试,已应用与工程中。
考虑到效率问题,没有用到string类,可以自己修改
/**********************************************************************
* 字符串分割函数,通过new分配新内存保存分割后的字符串数组,使用过后必须手动回收内存
* 返回值为分割后的字串列个数
***********************************************************************/
size_t split(LPCTSTR lpszSrc, LPCTSTR lpszToken, vector <LPTSTR>& vstr, size_t count)
{
if(!lpszSrc)
{
return 0;
}
LPCTSTR p1 = lpszSrc;
LPCTSTR p2;
LPCTSTR pend = p1 + count;
LPTSTR ptmp;
size_t len;
size_t tokenlen = _tcslen(lpszToken);
for( ; p1 < pend; )
{
// 排除最后一个字符(串)就是token的情况, 如 "a,b,,c,,", (","为token)
if(p1 == pend)
{
LPCTSTR p = p1 - tokenlen;
if( _tcsncmp( p, lpszToken, tokenlen ) == 0 )
{
ptmp = new TCHAR[1];
ptmp[0] = _T('\0');
vstr.push_back(ptmp);
}
break;
}
p2 = _tcsstr(p1, lpszToken);
if(!p2 || p2 >= pend)// 未找到或找到但已超出了范围,前端整体为一串,否则,继续划分
{
len = pend - p1;
}
else
{
len = p2 - p1;
}
ptmp = new TCHAR[len + 1];
if(!ptmp)
{
//printf("outofmemory.\n");
break;
}
_tcsncpy(ptmp, p1, len);
ptmp[len] = _T('\0');
vstr.push_back(ptmp);
p1 += len + tokenlen;
}
return vstr.size();
}
/**********************************************************************
* 回收内存并销毁分割字符串数组
* 使用split()函数分割字串后,必须手动回收内存
* 或者调用此函数回收内存,以免造成内存泄露
***********************************************************************/
void freevstr(vector <LPTSTR>& vstr)
{
for(vector <LPTSTR>::iterator itr = vstr.begin(); itr < vstr.end(); itr++)
{
if(*itr)
{
delete [] (*itr);
}
}
vstr.clear();
}
#include <iostream>#include <string>#include <stdlib.h>using namespace std;int main(){ string str = "AA,3,2,1"; char p[10]; const char* p1 = str.c_str(); char* name = NULL; int flag = 0; int index = 0; int a, b, c; int i; for(i = 0; i < str.size(); i++) { if(str[i] != ',') { p[index++] = p1[i]; } else { p[index] = '\0'; if(flag == 0) { name = p; name[index] = '\0'; cout << name << endl; } else if(flag == 1) { sscanf(p, "%d", &a); cout << a << endl; } else { sscanf(p, "%d", &b); cout << b << endl; } ++flag;// p = NULL; index = 0; } } p[index] = '\0'; sscanf(p, "%d", &c); cout << c << endl; system("pause"); return 0;}