我有2个问题,第一个是,我无法让我的线条在我的阵列打印中匹配。我只能得到匹配的第一行!
void printStructs(struct student *list, int size){
int j = 0;
printf("Last Name, First Name Term ID Course Section\n");
printf("-------------------------------- ---- --------- ------ -------\n");
while(j < size){
printf("%s, %-21s %-5d %-11d %s%d %7s\n", list[j].lastname, list[j].firstname, list[j].term, list[j].id, list[j].subjectname,list[j].catalog, list[j].section);
j++;
}
}
这为我提供了这个输出!
了解第一个是如何正确排列的?如何让其余的行完成此操作!?
现在我的第二个问题是我根本看不到的问题。请注意,显示姓氏前后第二行的额外“Susan”?它来自哪里!?它适用于所有其他名称,我在这里看不到什么?
编辑:涉及额外名称的错误无法在此处找到!刚刚意识到它与我的循环初始化名称与该值有关,如果我无法解决它将进一步编辑,现在忽略!
EDIT2“Extra String Issue!”:
好吧所以我已经缩小了问题所在但不完全是为什么会发生这种情况,我相信它与分隔符有关...这里是代码
studentsRead = readStudentList(inputf, students, N);
printf("%s\n", students[6].lastname);
printStructs(students, studentsRead);
/*for (j = 1 ; j <= 10-1 ; j++){
for(k = 0 ; k <= 10-2 ; k++){
if(students[k] > students[k+1]){
temp = students[k];
students[k] = students[k+1];
students[k+1] = temp;
}
}
}*/
fclose(inputf);
return 0;
}
int readStudentList(FILE *f, struct student *list, int maxSize){
char buff[65];
int count = 0;
while((count < maxSize) && (fgets(buff, sizeof(buff), f) != NULL)){
struct student item;
if(parseStudent(&item, buff)){
list[count++] = item;
}
}
return count;
}
int parseStudent(struct student *person, char *data){
char *ptr;
int i = 0;
ptr = strtok(data, DELIM);
person[i].term = atoi(ptr);
ptr = strtok(NULL, DELIM);
person[i].id = atoi(ptr);
ptr = strtok(NULL, DELIM);
strcpy(person[i].lastname, ptr);
printf("%s\n", person[i].lastname);
ptr = strtok(NULL, DELIM);
strcpy(person[i].firstname, ptr);
ptr = strtok(NULL, DELIM);
strcpy(person[i].subjectname, ptr);
ptr = strtok(NULL, DELIM);
person[i].catalog = atoi(ptr);
ptr = strtok(NULL, DELIM);
strcpy(person[i].section, ptr);
}
通过这段代码,所有内容都会正常打印,直到我的readStudentList调用之后的printf,它打印出最后一个名字字符串卡在最后的名字。虽然打印在我的解析函数中,但姓氏似乎正常显示?我一直在尝试将打印件放在所有地方以查看它出错的地方,但有些甚至不打印任何东西?
答案 0 :(得分:4)
问题在于您只使用%s
打印姓氏而不是指定宽度。这意味着该行的其余部分将根据名字的长度向左或向右移动。
至于你应该如何格式化这个,你可能想要先将名字和姓氏连在一起,然后以固定宽度打印结果:
char buffer[256];
sprintf(buffer, "%s, %s", list[j].lastname, list[j].firstname);
printf("%-32s ...", buffer, ...);
我的猜测是重复的名称问题源于错误地读取数据;似乎没有出现在您展示的代码中。
答案 1 :(得分:1)
printf(“%d%。 s”,数字,尺寸,字母);
注意:宽度(最小字段宽度)和精度(给出要打印的最大字符数)之间存在区别。 %s指定宽度,%。s指定精度。 (你也可以使用%。但是你需要两个参数,一个是宽度一个用于精度)
答案 2 :(得分:1)
问题出在%s
的{{1}},您必须使用printf
和last name
的单一格式说明符。因此,first name
concatenate
和last name
位于单独的缓冲区中,并在first name
中使用该缓冲区。