每个人的格式是姓氏,名字/首字母和中间名字 我有3个并行数组:char ** surname,char ** first和char * middle_init 我已经检查过我对Fgets的调用。我的算法是先将每一行存储到surname [i]中,然后将其解析为其组件,然后解析为3个并行数组。
问题: 我的程序有效,但出于某种原因,它并不适用于#34; Cauble-Chantrenne,Kristin K。"当我打印出姓[2]和第一[2]时,我得到: Cauble-Chantren KristLarson
int main(int argc, char *argv[]) {
char **surname, **first;
char *middle_init;
int num_people;
FILE *fp = fopen(argv[1], "r");
fscanf(fp, "%d", &num_people);
surname = (char**)malloc(sizeof(char*) * num_people);
first = (char**)malloc(sizeof(char*) * num_people);
middle_init = (char*)malloc(sizeof(char) * num_people);
read_names(fp, num_people, surname, first, middle_init);
fclose(fp);
printf("%s\n", surname[2]);
printf("%s\n", first[2]);
sort(num_people, surname, first, middle_init);
write_names(num_people, argv[2], surname, first, middle_init);
return 0;
}
有人可以告诉我我的问题是什么吗?谢谢!!!我确信我的问题与我的代码的这部分有关。附:据我所知,strtok返回一个指向令牌的指针并放置一个' \ 0'自动对吗?为什么第一[2]不是克里斯汀?它显然由2个分隔符分隔,即" " < - 空的空间。非常感谢!!真的很感激时间。
while(fgets(surname[i], 80, fp) != NULL) {
surname[i] = strtok(surname[i], ",");
if (strlen(surname[i]) >= 16) {
surname[i][15] = '\0';
}
first[i] = strtok(NULL, ". ");
if (strlen(first[i]) >= 16) {
first[i][15] = '\0';
}
middle_init[i] = *(strtok(NULL, ". "));
i++;
}
我的所有其他功能都完美无缺,我的错误就是从文件中读取3个数组中的数据。谢谢!
答案 0 :(得分:0)
您需要将临时缓冲区传递到fgets
,因为strtok
会删除原始字符串。因此,通过使用单独的字符串来保存读取行,您将防止意外结果切断源字符串。
此外,您的if
语句似乎很奇怪。您正在切断16字节的字符串,这可能是您想要做的,但在此代码块中执行此操作似乎很奇怪。