【发布时间】:2018-12-20 04:49:17
【问题描述】:
我有一个如下所示的文本文件:
Jane Smith 1111
Alex John 2222
Joe Bon 1234
我正在尝试解析这些数据并将其放入结构数组中。当我从文件中获取一行并使用 strtok 时,会打印正确的数据,但不会将其复制到结构中。如何复制数据?这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define MAX_NUM 100
struct object {
char fname[20];
char lname[20];
char phoneNum[20];
};
typedef struct object Person;
int main (int argc, char ** argv) {
FILE *fp;
int i = 0;
Person person[MAX_NUM];
fp = fopen(argv[1], "r");
char *token;
char line[256];
int y = 1;
while (fgets(line, sizeof(line), fp)) {
token = strtok(line, " ");
arr[0] = token;
while(token != NULL) {
token = strtok(NULL, " ");
arr[y] = token;
y++;
}
strcpy(person[i].fname, arr[0]);
strcpy(person[i].lname, arr[1]);
strcpy(person[i].phoneNum, arr[2]);
i++;
}
printf("%s\n", person[i].fname); //why does nothing print
printf("%s\n", person[i].lname);
printf("%s\n", person[i].phoneNum);
}
【问题讨论】:
-
读取第二行后
y的值是多少?这可能是学习如何使用调试器的好时机,但是您应该能够使用一张纸来模拟计算机来回答我的问题。 -
寻找
arr的神秘起源对我们来说是一个挑战吗? -
这里有一个可能的收获:将错误归咎于程序中最神秘的(对你而言)部分总是很诱人。所以当你学习一个新的 API 时,你会倾向于假设问题与此有关。夏洛克福尔摩斯不会犯这个错误。他会告诉你,大多数错误都是愚蠢的小错别字,我们每个人都会时不时犯,而你发现问题的最佳策略是客观地查看实际证据,不要预先判断。正是 tgat 的 习惯 使 福尔摩斯 成为 比 Cpl 更好 的 侦探 .普洛德。
-
我强烈建议不要使用 strtok(根据 Brian Kernighan 的说法,这是“计算历史上设计最差的函数”)。获取 strsep 的实现,省去你的麻烦。
标签: c arrays pointers token strtok