在C中解析具有多个空格的行在同一个字段中

时间:2015-12-28 12:24:25

标签: c parsing strtok

我有一个文本文件如下:

id name area dist
1  surya kumar 1 2

当我尝试使用带空格作为分隔符的strtok()函数在C中解析此行时,我得到如下输出:

1
surya
Kumar
1
2

第二个字段实际上是一个名称,因此它可以包含多个空格。有没有办法将第二个字段作为一个整体来处理,仍然可以解析整个行?

2 个答案:

答案 0 :(得分:0)

在调用strtok之前,计算字符串中的空格数,以便知道第3个字段的起始位置(即第二个字段的结束位置)。

答案 1 :(得分:0)

由于您的名字可能包含数字,我建议计算代币。

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

#define MAXFIELDS 10

int main(void) {
    //char input[] = "1 Ludwig 2 3";
    char input[] = "1 Ludwig 99 Beethoven 2 3";
    char *token[MAXFIELDS];
    char *tok;
    char name [100];
    int fields, index;
    int id, area, dist;

    fields = 0;
    tok = strtok(input, " ");
    while(tok != NULL) {
        if (fields >= MAXFIELDS)
            return 1;                           // error
        token[fields++] = tok;
        tok = strtok(NULL, " ");
    }
    if (fields < 4)
        return 1;                               // error

    index = 0;
    id = atoi(token[index++]);                  // id field
    strcpy(name, token[index++]);               // name field
    while(index < fields - 2) {
        strcat(name, " ");                      // append to name
        strcat(name, token[index++]);
    }
    area = atoi(token[index++]);                // area field
    dist = atoi(token[index++]);                // dist field

    printf("%d, %s, %d, %d\n", id, name, area, dist);
    return 0;
}

节目输出

1, Ludwig 99 Beethoven, 2, 3