【发布时间】:2012-12-06 02:12:15
【问题描述】:
在我的程序的一个函数中,我试图将文件中的数据加载到这个结构数组中:
/* database struct */
typedef struct node {
char name[MAX];
char address[MAX];
long int number;
}record_type;
record_type record[100];
函数如下:
/* load database from disk */
void load_database() {
char line[128];
/* Set up database */
database = fopen("database.txt", "r+w+a+");
if(database == NULL) {
printf("\n\tWARNING: No database found.");
exit(1);
}
/* Get database file from disk */
while(fgets(line, sizeof(line), database) != NULL) {
sscanf(line, "%s %s %lu", record[rec_num].name,
record[rec_num].address, &record[rec_num].number);
/* keeps track of array size */
rec_num++;
}
}
我遇到的问题是与 sscanf 不一致。如果我包含名字和姓氏,我不能在它们之间放置空格,否则它将名字放在 name[] 中,将姓氏放在 address[] 中。
这是我尝试输入的数据示例:
1. Name: james manes Address: 220 test addr Number: 5558889999
我需要将“james manes”放入 name[] 字段,将 220 test addr 放入 address[] 字段,将 5558889999 放入结构的 number 字段。这可能吗?
有没有更有效的方法来管理这种类型的输入?
【问题讨论】:
-
请提供您尝试解析的数据样本。
-
如果您需要处理输入中的可选空格,并且可能也在地址中,除非您在输入中的字段之间有可靠的分隔符,否则这很棘手。无论哪种方式,使用正则表达式解析器可能会更好(尝试
man 3 regex)。 -
@JimStewart 我从未研究过正则表达式。我会调查的。
-
如果您总是有名字和姓氏,这应该不是问题。如果您有时提供一个名称,有时提供两个名称,这只会有问题。
-
如果您要对电话号码进行算术运算以外的任何操作,我建议您将它们存储为字符串。这将简化查找正则表达式的过程。
标签: c input struct spaces scanf