解析同一字段中具有多个空格的 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
我有一个文本文件如下:
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