C 格式化printf和额外的字符串打印?

C 格式化printf和额外的字符串打印?,c,formatting,printf,C,Formatting,Printf,我有两个问题,第一个问题是,我无法在阵列的打印输出中匹配我的行。我只能得到第一条线来匹配 void printStructs(struct student *list, int size){ int j = 0; printf("Last Name, First Name Term ID Course Section\n"); printf("-------------------------------- ---- --------- -

我有两个问题,第一个问题是,我无法在阵列的打印输出中匹配我的行。我只能得到第一条线来匹配

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++;

}
}
void printStructs(结构学生*列表,整数大小){
int j=0;
printf(“姓,名,术语ID课程部分\n”);
printf(“---------------------------------------\n”);
而(j
这为我提供了这个的输出

看到只有第一个正确排列了吗?我如何让其余的行执行此操作

现在我的第二个问题是我根本看不到的。请注意,在显示姓氏之前的倒数第二行中有额外的“Susan”?那是从哪里来的!?它适用于所有其他名称,我在这里没有看到什么

编辑:此处找不到涉及额外名称的错误!刚意识到它与我的循环有关,将名称初始化为该值,如果我不能理解它,将进一步编辑,现在忽略

EDIT2“额外字符串问题!”:

好吧,我已经缩小了问题的范围,但并不是确切的原因,我相信这与分隔符有关…下面是代码

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);

}
studentsRead=readStudentList(inputf,students,N);
printf(“%s\n”,学生[6]。姓氏);
打印结构(学生、学生阅读);

/*对于(j=1;j而言,问题在于打印姓氏时只使用
%s
,而不是指定宽度。这意味着该行的其余部分将根据姓氏的长度向左或向右移动

至于如何格式化,您可能希望首先将名字和姓氏连接在一起,然后以固定宽度打印结果:

char buffer[256];

sprintf(buffer, "%s, %s", list[j].lastname, list[j].firstname);

printf("%-32s ...", buffer, ...);

我的猜测是,重复名称问题源于错误地读取数据;似乎不在您显示的代码中。

问题在于,您只使用
%s
打印姓氏,而不是指定宽度。这意味着根据第一行的长度,该行的其余部分将向左或向右移动名字

至于如何格式化,您可能希望首先将名字和姓氏连接在一起,然后以固定宽度打印结果:

char buffer[256];

sprintf(buffer, "%s, %s", list[j].lastname, list[j].firstname);

printf("%-32s ...", buffer, ...);
我的猜测是,重复名称问题源于错误地读取数据;似乎不在您显示的代码中。

printf(“%d%.s”,数字、大小、字母);
注意:宽度(最小字段宽度)和精度(最大打印字符数)之间有区别。%s指定宽度,%.s指定精度。(您也可以使用%。。但是您需要两个参数,一个用于宽度,一个用于精度)

printf(“%d%.s”,数字、大小、字母);
注意:宽度(最小字段宽度)和精度(最大打印字符数)之间有区别。%s指定宽度,%.s指定精度。(您也可以使用%。。但是您需要两个参数,一个用于宽度,一个用于精度)


问题在于
%s
printf
,您必须为
姓氏
名字
使用单一格式说明符。因此
姓氏
名字
串联在单独的缓冲区中,并在
printf
中使用该缓冲区问题在于的
%s
printf
,您必须为
last name
first name
使用单一格式说明符。因此
last name
first name
串联在单独的缓冲区中,并在
printf
中使用该缓冲区,我几乎无法读取您的输出。一幅裁剪过大的图片会比this:-)@Aniket:在大多数当前浏览器中,您应该能够右键单击图片并在新选项卡(或新窗口)中打开它,然后可以查看完整大小。计算您姓氏中的字母并将其与列偏移量匹配,您将看到对齐情况。你想要一个单一的宽度限制的组合名称,这将意味着建立单独的组合。我几乎看不懂你的输出。一张裁剪过的大图片要比这个好得多:-)@Aniket:在大多数当前浏览器中,您应该能够右键单击图片并在新选项卡(或新窗口)中打开它,然后您可以查看完整大小的图片。计算您姓氏中的字母,并将其与列偏移量匹配,您将看到对齐情况。你想要一个单一的宽度限制的组合名称,这将意味着建立单独的组合。是的,我有点难堪,通过阅读我的代码,现在它是如何到达那里,将作出编辑,如果我没有看到它后,再扫几次!也!谢谢有没有办法去掉空格?我把所有的东西都排好了,但是逗号都在姓氏的右边,但是upLol排好了。哇,多么聪明的解决办法,我没想到,谢谢!是的,我现在阅读我的代码时有点困惑,它是如何到达那里的,如果我在几次扫描后没有看到它,我会对它进行编辑!也!谢谢有没有办法去掉空格?我把所有的东西都排好了,但是逗号都在姓氏的右边,但是upLol排好了。哇,多么聪明的解决办法,我没想到,谢谢!现在只需给出你的名字和姓氏的最大长度。现在只需给出你的名字和姓氏的最大长度。