我的教授讓我撰寫一個程式,讀取 X 人的姓名、年齡、古代和檔案,完成后,將其列印成表格格式。對于所有這些,我必須有 2 個獨立的功能。一個讀取用戶輸入的內容,另一個以表格格式輸出用戶輸入的所有內容。
現在,問題是當我嘗試列印收集的資訊時,它只列印陣列上每個“槽”的第一個字符。這是我的代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define sfb if(db[i][0][0] == 17 || db[i][1][0] == 17 || db[i][2][0] == 17 || db[i][3][0] == 17){break;}
void read();
void printt(char *, int);
int main(){
read();
return 0;
}
void read(){
char db[20][4][20];
memset(db, 0, sizeof db);
printf("Ingrese ^Q para salir\n");
int i;
for(i = 0; i < 20; i ){
printf("Ingrese nombre de persona: ");
fgets(db[i][0], sizeof db[i][0], stdin);
db[i][0][strcspn(db[i][0], "\n")] = 0;
sfb;
printf("Ingrese legajo de %s: ", db[i][0]);
fgets(db[i][1], sizeof db[i][1], stdin);
db[i][1][strcspn(db[i][1], "\n")] = 0;
sfb;
printf("Ingrese edad de %s: ", db[i][0]);
fgets(db[i][2], sizeof db[i][2], stdin);
db[i][2][strcspn(db[i][2], "\n")] = 0;
sfb;
printf("Ingrese antiguedad de %s: ", db[i][0]);
fgets(db[i][3], sizeof db[i][3], stdin);
db[i][3][strcspn(db[i][3], "\n")] = 0;
sfb;
}
printt(&db[0][0][0], i);
}
void printt(char *dbp, int slots){
system("cls");
printf("%-30s|%-20s|%-7s|%-10s\n", "Nombre", "Legajo", "Edad", "Antiguedad");
for (int i = 0; i < slots * 80; i = i 80){
printf("%-30c|%-20c|%-7c|%-10c\n", *(dbp i), *(dbp i 20), *(dbp i 40), *(dbp i 60));
}
printf("\n");
system("pause");
}
現在,我必須澄清一下,我知道我正在使用%c
而不是%s
在printf()
(Ln 48) 中,但如果我輸入%s
,它將無法編譯,它會給我下一個錯誤,4 次:
format '%s' expects argument of type 'char *', but argument 2 has type 'int' [-Werror=format=]
我知道發生這種情況是因為使用指標,我只參考陣列的第一個元素。我的問題是是否有任何東西可以告訴printf()
列印指標指示的位置,并且 X (20) 放置更多。在我的腦海中,我想象這樣的事情:
printf("%-30s|%-20s|%-7s|%-10s\n", *(dbp i)[20], *(dbp i 20)[20], *(dbp i 40)[20], *(dbp i 60)[20]);
我也知道我可以使用for()
回圈來逐個字符地列印每個欄位,但我不喜歡它的外觀:/
如果沒有我想象的那樣,我將被困在使用for()
回圈方法。
uj5u.com熱心網友回復:
您不需要取消參考指標,并且可以傳遞dpb[0][0]
而不是dbp[0][0][0]
.
您可能想考慮使用struct
s 而不是多維陣列,它會使邏輯更簡單。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define sfb if(db[i][0][0] == 17 || db[i][1][0] == 17 || db[i][2][0] == 17 || db[i][3][0] == 17){break;}
void read();
void printt(char *, int);
int main(){
read();
return 0;
}
void read(){
char db[20][4][20];
memset(db, 0, sizeof db);
printf("Ingrese ^Q para salir\n");
int i;
for(i = 0; i < 20; i ){
printf("Ingrese nombre de persona: ");
fgets(db[i][0], sizeof db[i][0], stdin);
db[i][0][strcspn(db[i][0], "\n")] = 0;
sfb;
printf("Ingrese legajo de %s: ", db[i][0]);
fgets(db[i][1], sizeof db[i][1], stdin);
db[i][1][strcspn(db[i][1], "\n")] = 0;
sfb;
printf("Ingrese edad de %s: ", db[i][0]);
fgets(db[i][2], sizeof db[i][2], stdin);
db[i][2][strcspn(db[i][2], "\n")] = 0;
sfb;
printf("Ingrese antiguedad de %s: ", db[i][0]);
fgets(db[i][3], sizeof db[i][3], stdin);
db[i][3][strcspn(db[i][3], "\n")] = 0;
sfb;
}
printt(db[0][0], i);
}
void printt(char *dbp, int slots){
system("cls");
printf("%-30s|%-20s|%-7s|%-10s\n", "Nombre", "Legajo", "Edad", "Antiguedad");
for (int i = 0; i < slots * 80; i = i 80){
printf("%-30s|%-20s|%-7s|%-10s\n", (dbp i), (dbp i 20), (dbp i 40), (dbp i 60));
}
printf("\n");
system("pause");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/470467.html