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

Parsing a line in C with multiple spaces in the same filed

我有一个文本文件如下:

id name area dist
1  surya kumar 1 2

当我尝试使用以 space 作为分隔符的 strtok() 函数在 C 语言中解析这一行时,我得到的输出如下:

1
surya
Kumar
1
2

第二个字段实际上是一个名称,因此它可以包含多个 space。有没有办法将第二个字段视为一个完整的单词,并且仍然能够解析整行?

在调用 strtok 之前,计算字符串中的空格数以了解第三个字段的开始位置(即第二个字段的结束位置)。

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

#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