如何从字符串中提取和分解字符?

ahuu 2004-04-28 01:22:20
有一长字符串(也称参数串,如name为参数,zhangsan为参数值,以此类推):name=zhangsan&age=20&usrid=1123&grade=two&class=five&address=beijing

第一个问题:
如何从这个字符串中提取我所需要的字符,比如说:首先在程序中定义几个变量,char *szName,*szAge,*szUsrId,*szGrade等等,这些变量分别存放字符串相对应的参数值,结果是:*szName == zhangsan ,*szAge == 20 ,*szUsrId == 1123等等,这个如何做到?

第二个问题:
分解这个字符串成若干个子字符串,如分解成:name=zhangsan,age=20,usrid=1123等等(以&为分隔符)。

我用的工具是vc6.0
...全文
250 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tyrobird 2004-04-29
  • 打赏
  • 举报
回复
用strtok吧,比如

char str[]="name=zhangsan&age=20&usrid=1123&grade=two&class=five&address=beijing";
char* sz[6];
char *szName,*szAge,*szUsrId,*szGrade;
char* p;

p = strtok(str, "&");
for(int i=0; i<6&&p!=NULL; i++)
{
sz[i] = p; /*你第二个问题的结果 */
p = strtok(NULL, "&");
}

p = strchr(sz[0], '='); // sz[0] = "name=zhangsan"
szName = ++p;
p = strchr(sz[1], '=');
szArg = ++p;
...







zzghost 2004-04-29
  • 打赏
  • 举报
回复
#include <string>
#include <vector>
#include <iostream>
using std::string;
using std::vector;
using std::cout;
using std::endl;

int main()
{
std::string ssrc = "name=zhangsan&age=20&usrid=1123&grade=two&class=five&address=beijing";
//vector<std::string> vtagstr;
std::string pars1[6];
std::string pars2[6];

string::size_type posbst=0,posest=0;
int i=0;
while((posbst= ssrc.find_first_of('=',posbst))!=std::string::npos)
{
posest = ssrc.find_first_of('&',posbst);
if(posest == std::string::npos)
posest = ssrc.size();

//vtagstr.push_back(ssrc.substr(posbst+1,posest-posbst-1));
pars1[i] = ssrc.substr(posbst+1,posest-posbst-1); ++i;
++posbst;
}//分解成zhangsan 20 1123 two five beijing

posbst = 0; posest = 0; i=0;

while( (posbst!=std::string::npos)&&( posbst = ssrc.find_first_not_of('&',posbst))!=std::string::npos)
{
posest = ssrc.find_first_of('&',posbst);
if(posest==std::string::npos)
posest = ssrc.size();

//vtagstr.push_back(ssrc.substr(posbst,posest-posbst));
pars2[i] = ssrc.substr(posbst,posest-posbst); ++i;
posbst = posest;
}//分解成 name=zhangsan age=20 usrid=1123 grade=two class=five address=beijing

//for( vector<string>::size_type i=0; i<vtagstr.size();++i)
// cout << vtagstr[i]<<" ";


return 0;
}
EricZhuo 2004-04-28
  • 打赏
  • 举报
回复
你可以使用getline
std::string tmpStr;
std::stringstream("your string");
getline(someIStream, tmpStr, '=');
这样就可以了。
rorot 2004-04-28
  • 打赏
  • 举报
回复
第二个问题:
用一个指针constt char *ptr = str( str是你的字符串的首地址 ) 移动指针,匹配'&",不是指针就压入缓冲区char buffer[MAXSIZE]; 当遇到'&'则表示buffer里面是你要的内容,则可以或者打印或者存储到别的地方。然后再清空缓冲区,memset( buffer ,0, MAXSIZE )继续读
第一个问题:拿你前面第二个问题得到的每个字符串取等号前面的字符串和你的变量名匹配,就,匹配成功,就把字符串等号后面的地址赋值给指针变量.
allsword 2004-04-28
  • 打赏
  • 举报
回复
#include <iostream.h>
#include <string.h>

int main()
{
char str[]="name=zhangsan&age=20&usrid=1123&grade=two&class=five&address=beijing";
char *szName,*szAge,*szUsrId,*szGrade;
char ch[]="0";
int i=0,flag=0;
bool brd=0;
szName=new char[20];
szAge=new char[20];
szUsrId=new char[20];
szGrade=new char[20];

szName[0]='\0';
szAge[0]='\0';
szUsrId[0]='\0';
szGrade[0]='\0';

while(str[i]!='\0')
{
if(brd&&str[i]!='&')
{
ch[0]=str[i];
switch(flag)
{
case 0://name
strcat(szName,ch);
break;
case 1://age
strcat(szAge,ch);
break;
case 2://usrid
strcat(szUsrId,ch);
break;
case 3://grade
strcat(szGrade,ch);
break;
default:
break;
}
}

if(str[i]=='=')brd=1;
if(str[i]=='&')
{
flag++;
brd=0;
}
i++;
}

cout<<"str "<<str<<endl;
cout<<"name "<<szName<<endl;
cout<<"age "<<szAge<<endl;
cout<<"usrid "<<szUsrId<<endl;
cout<<"grade "<<szGrade<<endl;
delete [] szName;
delete [] szAge;
delete [] szUsrId;
delete [] szGrade;

return 0;
}
//VC6运行结果
str name=zhangsan&age=20&usrid=1123&grade=two&class=five&address=beijing
name zhangsan
age 20
usrid 1123
grade two
Press any key to continue

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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