2013-03-02 91 views
1

我有两个问题,第一个是,我无法让我的线匹配打印出我的阵列。我只能得到第一行匹配!格式化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++; 

} 
} 

这给了我这个输出!

Detail

了解如何只有第一个被正确一字排开?我如何获得剩余的线路来做到这一点!?

现在我的第二个问题是我只是根本看不到。注意显示姓氏前倒数第二行的额外“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); 

} 

通过这段代码,所有东西都会正常打印,直到readStudentList调用之后,printf才会打印出来,这会在最后打印出名字为String的名字。尽管打印在我的解析函数中,姓氏似乎正常显示?我一直在试图把打印出来的地方,看看它出错哪里,但其中有些甚至不会打印任何东西?

+0

我几乎无法读取您的输出。裁剪出更大的图片会比这更好:-) – 2013-03-02 04:25:13

+1

@Aniket:对于大多数当前浏览器,您应该能够右键单击图片并在新标签页(或新窗口)中打开它,您可以然后查看全尺寸。 – 2013-03-02 04:28:24

+0

计算姓氏中的字母并将其与列偏移相匹配,您会看到对齐方式。您希望为组合名称指定一个宽度限制,这意味着要单独构建组合。 – jthill 2013-03-02 04:31:44

回答

4

问题是您打印的姓氏只有%s而不是指定宽度。这意味着该行的其余部分会根据名字的长度左右移动。

至于你应该如何格式化这个,你可能想通过连接第一和最后一个名字连在一起,然后打印结果在一个固定宽度的开始:

char buffer[256]; 

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

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

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

+0

是啊,我有点难以理解我的代码现在如何到达那里,如果我没有看到它后几次扫描将做出编辑!也!谢谢! – Sherifftwinkie 2013-03-02 04:32:04

+0

无论如何摆脱空白?我已经排好了所有东西,但逗号远远超过了姓氏的右边,但排队了 – Sherifftwinkie 2013-03-02 04:39:44

+0

@Sherifftwinkie:请参阅已编辑的答案 – 2013-03-02 04:45:34

1

printf(“%d%。s”,number,SIZE,letters);
注意:宽度(这是最小字段宽度)和精度(它给出要打印的最大字符数)之间有区别。 %s指定宽度,%.s指定精度。 (并且也可以使用%。
但这时就需要两个参数,一个用于宽度一个为精密)

enter image description here

+0

现在只是给你的名字和姓氏的最大长度。 – 2013-03-02 04:47:35

1

的问题是在printf%s,必须使用单个格式说明用于last namefirst name。所以concatenatelast namefirst name在单独的缓冲区中,并在printf中使用该缓冲区。