c中的字符串标记符直到制表符和换行符

时间:2013-12-03 17:21:16

标签: c string token

当我想要对下面的文本进行标记并在结构中保存标记时,我遇到了一些问题。

Wojciech Szczęsny   POL     G   1.95    84  18-04-90    Warsaw  Legia Warszawa
Bacary Sagna    FRA     D   1.76    72  14-02-83    Sens    Auxerre
Per Mertesacker     GER     D   1.98    90  29-09-84    Hannover    Werder Bremen

Bewtween是一个空格和一个标签,我想提供以下内容:

t[1].nev = Wojciech Szczesny
 t[1].orsz = POL
 t[1].poz = G
 t[1].mag = 1.95
 t[1].suly = 84
 t[1].datum = 18-04-90
 t[1].varos = Warsaw
 t[1].ecs = Legia Warszawa and etc.

我没有编辑txt文件,因为它包含超过20,000个数据。

我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

typedef struct{
    char nev[50];
    char orsz[3];
    char poz[3];
    float mag;
    int suly;
    char datum[10];
    char varos[30];
    char ecs[50];
}JATEKOS;

int main(){
    FILE*f=fopen("Text.txt","rt");
    int i;
    JATEKOS*t;
    t = (JATEKOS*)malloc(3*sizeof(JATEKOS));
    for(i=1;i<=2;++i){
        fscanf(f,"%[^\t]",t[i].nev);
        fscanf(f,"%[^\t]",t[i].orsz);
        fscanf(f,"%[^\n]",t[i].poz);
        fscanf(f,"%[^\t]",&t[i].mag);
        fscanf(f,"%[^\t]",&t[i].suly);
        fscanf(f,"%[^\t]",t[i].datum);
        fscanf(f,"%[^\t]",t[i].varos);
        fscanf(f,"%[^\n]",t[i].ecs);
    }
    printf("\n\n");
    for(int i=1;i<=2;++i){
        //printf("%s  %s  %s  %f  %i  %s  %s  %s",t[i].nev,t[i].orsz,t[i].poz,t[i].mag,t[i].suly,t[i].datum,t[i].varos,t[i].ecs);
        printf("%s  %s  %s",t[i].nev,t[i].orsz,t[i].poz);
    }

    getch();
}

1 个答案:

答案 0 :(得分:1)

大多数时候,C程序员会保存很少的实用程序以备将来使用 - 一个是使用strtok打破一个字符串。试试这个更灵活:

typedef struct{
    char nev[50];
    char orsz[3];
    char poz[3];
    float mag;
    int suly;
    char datum[10];
    char varos[30];
    char ecs[50];
}JATEKOS;
#define MAX_SPLIT 24

char **split(char **result, char *working, const char *delim)
{
     int i;
     char *p=strtok(working, delim);
     for(i=0; p!=NULL && i<MAX_SPLIT; p=strtok(NULL, delim), i++)
     {
         result[i]=p;
         result[i+1]=NULL;
     }
     return result;
}


int main()
{
    FILE*f=fopen("Text.txt","rt");
    int i=0;
    JATEKOS *t, *rec;
    char tmp[128]={0x0};
    char *r[MAX_SPLIT + 1]={NULL};

    t = (JATEKOS*)malloc(3*sizeof(JATEKOS));
    rec=t;
    while(fgets(tmp, 128, f)!=NULL)
    {
        split(r, tmp, "\t \n");
        sprintf(rec->nev, "%s %s", r[0], r[1]);
        strcpy(rec->orsz,   r[2]);
        strcpy(rec->poz ,   r[3]);
        rec->mag=atof(      r[4]);
        rec->suly=atoi(     r[5]);
        strcpy(rec->datum, r[6]);
        strcpy(rec->varos, r[7]);
        strcpy(rec->ecs  , r[8]);
        i++;
        if(i==2) break;
        rec++;
    }
    printf("\n\n");
    for(i=1;i<=2;++i){
        //printf("%s  %s  %s  %f  %i  %s  %s  %s",t[i].nev,t[i].orsz,t[i].poz,t[i].mag,t[i].suly,t[i].datum,t[i].varos,t[i].ecs);
        printf("%s  %s  %s",t[i].nev,t[i].orsz,t[i].poz);
    }

    getch();
    return 0;
}