EDIT 2:好吧,我所做的只是将姓氏[i]指向的字符的malloc更改为50字节,我的程序运行良好。有人能解释一下原因吗?我认为这是因为strtok返回了一个指向大于16字节的字符串的指针,我正试图将该字符串分配给一个动态分配的16字节数组。谢谢我试图解析一个文件中的一行,并将它们存储到3个并行数组中。我正在阅读的文本文件中有这样的内容:
Ryan,Elizabeth O麦金太尔捕获Chantrenne,Kristin KLois F.LarsonThorpe,Trinity RRuiz,Pedro M.
每个人的格式为姓氏、名字/首字母和中间首字母我有3个并行数组:char**姓氏、char**第一和char*midd_init我已经检查过我打给Fgets的电话是否正常。我的算法是首先将每一行存储到姓氏[i]中,并将其解析为其组件,然后解析为3个并行数组。
问题:我的程序有效,但由于某种原因,它不适用于"Cauble Chantrenne,Kristin K."。当我打印出姓氏[2]和第一个[2]时,我得到:捕获的ChantrenKristLarson
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("%sn", surname[2]);
printf("%sn", first[2]);
sort(num_people, surname, first, middle_init);
write_names(num_people, argv[2], surname, first, middle_init);
return 0;
}
有人能告诉我我的问题是什么吗?谢谢!!!我确信我的问题与我的代码的这一部分有关。附言:据我所知,strtok返回一个指向令牌的指针,并自动放置一个"\0",对吗?为什么first[2]不是Kristin?它显然由两个分隔符分隔,即"<-空的空间。非常感谢!!真的很感激这段时间。
while(fgets(surname[i], 80, fp) != NULL) {
surname[i] = strtok(surname[i], ",");
if (strlen(surname[i]) >= 16) {
surname[i][15] = ' ';
}
first[i] = strtok(NULL, ". ");
if (strlen(first[i]) >= 16) {
first[i][15] = ' ';
}
middle_init[i] = *(strtok(NULL, ". "));
i++;
}
我的所有其他函数都能很好地工作,我的错误只是在将文件中的数据读取到3个数组中。谢谢
您需要将一个临时缓冲区传递到fgets
中,因为strtok
会截断原始字符串。因此,通过使用一个单独的字符串来保存读取行,可以防止意外结果截断源字符串。
此外,您的if
语句似乎很奇怪。您正在剪切16字节的字符串,这可能是您想要做的,但在这个代码块中这样做似乎很奇怪。