2013-03-02 116 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中使用該緩衝區。