【发布时间】:2016-09-13 04:35:38
【问题描述】:
我正在使用具有两个字段的 fscanf 读取 CSV 文件。
datatype_t*read(FILE* fp)
{
char name[66];
char data[1466];
if (fscanf(fp, "%[^,] %[^\n]", name, data) == 2) {
datatype_t *d = (datatype_t*)malloc(sizeof(datatype_t));
d->name = strdup(name);
d->data = strdup(data);
return d;
}
return NULL;
}
CSV文件数据如下
戴夫先生,学校老师
迈克,头
萨钦,工作人员
现在我正在读取另一个包含数据的文本文件。
char buffer[66];
if (fgets(buffer,sizeof buffer, fp) != NULL ) {
keydata_t *k = (keydata_t*)malloc(sizeof(keydata_t));
size_t len = strlen(buffer);
if(buffer > 0 && buffer[len-1] == '\n'){
buffer[--len] = '\0';
}
k->name = strdup(buffer);
return k;
}
return NULL;
}
txt 文件的数据如下所示。
戴夫先生
罗恩
蒂姆先生
现在当我比较数据字符串时:
new_ptr = root;
while((keyt = read_key(keyfile))!= NULL){
printf("%s\n", keyt->name);
printf("%s\n", root->key);
if(strcmp(keyt->name, root->key) == 0){
printf("match\n");
}
else if(strcmp(keyt->name, root->key) > 0){
printf("not equal\n");
}
else if (strcmp(keyt->name, root->key) < 0){
printf("not equal\n");
}
new_ptr = search(new_ptr, keyt);
}
一直打印
不等于
即使对于应该匹配的戴夫先生。我似乎无法弄清楚这两个问题。
【问题讨论】:
-
你调试过你的代码吗?或者至少,你打印了程序读取的内容吗?
-
@GMichael :是的,它正确打印出名称,但它说通过 strcmp 时它们不相等!
-
这一行:
if (fscanf(fp, "%[^,] %[^\n]", name, data) == 2) {将包含命令,作为第二个参数的第一个字符。建议:if (fscanf(fp, "%[^,] %c %[^\n]", name, data) == 2) { -
在 C 中,内存分配函数的返回类型:(malloc, calloc, realloc) 是
void*,可以分配给任何其他指针。转换返回的类型只会使代码混乱,使其更难以理解、调试和维护。建议去掉演员表。使用前务必检查 (!=NULL) 返回值,以确保操作成功。 -
变量名应该表示内容或用法(或者更好,两者兼有)
d是没有意义的,即使在当前发布的代码中也是如此。