Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 分析所需值的字符串_C_String - Fatal编程技术网

C 分析所需值的字符串

C 分析所需值的字符串,c,string,C,String,我有一个如下所示的数据,它分别包含人名和年龄,我只显示了3个人名和各自的年龄,我也可以在该字符串中有许多姓名和各自的年龄 我想解析这个字符串并将名称和相应的年龄存储在一个结构中,你能告诉我如何解析这个名称和年龄吗。例如:我想得到Allan 35并将其分别存储在下面的结构中的name和age字段中。对于该字符串中的所有名称,以此类推。 如何解析字符串,我尝试了strstr(),但它对我没有用。请告诉任何人如何解析这个字符串 struct data_base{ char *name; int

我有一个如下所示的数据,它分别包含人名和年龄,我只显示了3个人名和各自的年龄,我也可以在该字符串中有许多姓名和各自的年龄

我想解析这个字符串并将名称和相应的年龄存储在一个结构中,你能告诉我如何解析这个名称和年龄吗。例如:我想得到Allan 35并将其分别存储在下面的结构中的name和age字段中。对于该字符串中的所有名称,以此类推。 如何解析字符串,我尝试了strstr(),但它对我没有用。请告诉任何人如何解析这个字符串

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
  }
}