C 分析所需值的字符串
我有一个如下所示的数据,它分别包含人名和年龄,我只显示了3个人名和各自的年龄,我也可以在该字符串中有许多姓名和各自的年龄 我想解析这个字符串并将名称和相应的年龄存储在一个结构中,你能告诉我如何解析这个名称和年龄吗。例如:我想得到Allan 35并将其分别存储在下面的结构中的name和age字段中。对于该字符串中的所有名称,以此类推。 如何解析字符串,我尝试了strstr(),但它对我没有用。请告诉任何人如何解析这个字符串C 分析所需值的字符串,c,string,C,String,我有一个如下所示的数据,它分别包含人名和年龄,我只显示了3个人名和各自的年龄,我也可以在该字符串中有许多姓名和各自的年龄 我想解析这个字符串并将名称和相应的年龄存储在一个结构中,你能告诉我如何解析这个名称和年龄吗。例如:我想得到Allan 35并将其分别存储在下面的结构中的name和age字段中。对于该字符串中的所有名称,以此类推。 如何解析字符串,我尝试了strstr(),但它对我没有用。请告诉任何人如何解析这个字符串 struct data_base{ char *name; int
struct data_base{
char *name;
int age;
};
char data[] = "Name Allan Age 35 Name John Age 50 Name Jim Age 20 ....."
您可能想使用。您需要使用
%s
格式表示人名,使用%d
格式表示年龄。您可以使用strtok
提取标记。您可以使用两个指针来获取单词的开头和结尾
通过strstr使用指针p获得“Name”的位置,然后使用forth 5获得Name的开始位置,然后使用带有空格的strhr使用指针q获得Name的结束位置,然后可以使用snprintf的strncpy获得确切的Name#include
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct data_base{
char *name;
int age;
};
#define NAME_TAG "Name "
#define AGE_TAG "Age "
char* getName(char **p){
int tag_size = strlen(NAME_TAG);
if(strncmp(*p, NAME_TAG, tag_size)==0){
char *agep = strstr(*p += tag_size, AGE_TAG);
int len = agep - *p -1;//-1: for space before "Age"
char *name = calloc(len + 1, sizeof(char));
strncpy(name, *p, len);
*p = agep;
return name;
}
return NULL;
}
int getAge(char **p){
int tag_size = strlen(AGE_TAG);
if(strncmp(*p, AGE_TAG, tag_size)==0){
int age = (int)strtol(*p += tag_size, p, 10);
if(**p == ' ')
*p += 1;
return age;
}
return -1;
}
struct data_base *parse(char *data, size_t *size){
char *p = data;
struct data_base *dbp=NULL;
*size = 0;
while(*p){
*size += 1;
dbp = realloc(dbp, sizeof(struct data_base)*(*size));
dbp[*size -1].name = getName(&p);//this is treated as format is correct
dbp[*size -1].age = getAge(&p);
}
return dbp;//realloc(dbp, sizeof(struct data_base)*(*size));
}
int main(void){
char data[] = "Name Allan Age 35 Name John Age 50 Name Jim Age 20";
struct data_base *dbp;
size_t i, size;
dbp = parse(data, &size);
//check print
for(i = 0; i < size ;++i){
printf("Name: %s, Age: %d\n", dbp[i].name, dbp[i].age);
}
//deallocate
return 0;
}
#包括
#包括
结构数据库{
字符*名称;
智力年龄;
};
#定义名称\标记“名称”
#定义年龄\标记“年龄”
char*getName(char**p){
int tag_size=strlen(NAME_tag);
如果(strncmp(*p,名称标记,标记大小)=0){
char*agep=strstrstr(*p+=tag\u size,AGE\u tag);
int len=agep-*p-1;//-1:用于“Age”之前的空格
char*name=calloc(len+1,sizeof(char));
strncpy(名称,*p,len);
*p=agep;
返回名称;
}
返回NULL;
}
int getAge(字符**p){
int tag_size=strlen(年龄标签);
如果(strncmp(*p,年龄标签,标签大小)=0){
int age=(int)strtol(*p+=标签大小,p,10);
如果(**p='')
*p+=1;
回归年龄;
}
返回-1;
}
结构数据库*解析(字符*数据,大小*size){
char*p=数据;
结构数据库*dbp=NULL;
*尺寸=0;
而(*p){
*大小+=1;
dbp=realloc(dbp,sizeof(结构数据库)*(*size));
dbp[*size-1].name=getName(&p);//这被视为格式正确
dbp[*size-1].age=getAge(&p);
}
返回dbp;//realloc(dbp,sizeof(struct data_base)*(*size));
}
内部主(空){
char data[]=“姓名Allan 35岁姓名John 50岁姓名Jim 20岁”;
结构数据库*dbp;
尺寸(i),尺寸;;
dbp=解析(数据和大小);
//支票印刷
对于(i=0;i
使用sscanf()
创建处理每条记录的函数
//扫描字符串,如果成功返回>0,如果完成返回0,否则返回错误代码
int JZ_ScanDB(常量字符*数据、int*索引、结构数据库*Dest){
如果(目的地){
Dest->age=0;//形成默认答案
Dest->name=0;
}
如果(!data | | |!Index | |!Dest)返回-1;//代码中的小精灵
if((*Index<0)| |(*Index>strlen(数据)))返回-2;//更多的小精灵
如果(数据[*索引]='\0')返回0;//我们完成了
字符名[1000];
int retval=sscanf(&data[*索引],“名称%s年龄%d%n”,名称,&Dest->年龄,索引);
如果(返回值!=2){
返回-3;
}
Dest->name=strdup(名称);
返回0;
}
void DoIt(){
char data[]=“姓名Allan 35岁姓名John 50岁姓名Jim 20岁”;
int i=0;
结构数据库人员;
int ret;
而((ret=JZ_ScanDB(数据、i和人员))>0){
//和某人一起做些事情,注意内存管理
}
如果(ret){
//处理不寻常的停止原因
}
}
// Scan string, return >0 if successful, 0 if done, else error code
int JZ_ScanDB(const char *data, int *Index, struct data_base *Dest) {
if (Dest) {
Dest->age = 0; // Form default answer
Dest->name = 0;
}
if (!data || !Index || !Dest) return -1; // Gremlins in your code
if ((*Index < 0) || (*Index > strlen(data))) return -2; // More gremlins
if (data[*Index] == '\0') return 0; // we are done
char Name[1000];
int retval = sscanf(&data[*Index], "Name %s Age %d %n", Name, &Dest->age, Index);
if (retval != 2) {
return -3;
}
Dest->name = strdup(Name);
return 0;
}
void DoIt() {
char data[] = "Name Allan Age 35 Name John Age 50 Name Jim Age 20";
int i = 0;
struct data_base Person;
int ret;
while ((ret = JZ_ScanDB(data, &i, &Person)) > 0) {
// do something with Person, watch for memory management
}
if (ret) {
// deal with unusual reason for stopping
}
}