printf("%s", *string) 可能吗?
Is printf("%s", *string) possible?
我的教授让我制作一个程序,读取 X 个人的姓名、年龄、历史和年表,完成后,以类似 table 的格式打印出来。对于所有这些,我必须有 2 个独立的功能。一个读取用户输入的内容,另一个以 table 格式输出用户输入的所有内容。
现在,问题是当我尝试打印收集到的信息时,它只打印数组中每个“插槽”的第一个字符。这是我的代码:
#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");
}
现在,我必须澄清一下,我知道我在 printf()
(Ln 48) 中使用 %c
而不是 %s
,但是如果我把 %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()
循环方式
您不需要取消引用指针,您可以传递 dpb[0][0]
而不是 dbp[0][0][0]
的地址。
您可能想研究使用 struct
s 而不是 multi-dimensional 数组,这将使逻辑简单得多。
#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");
}
我的教授让我制作一个程序,读取 X 个人的姓名、年龄、历史和年表,完成后,以类似 table 的格式打印出来。对于所有这些,我必须有 2 个独立的功能。一个读取用户输入的内容,另一个以 table 格式输出用户输入的所有内容。
现在,问题是当我尝试打印收集到的信息时,它只打印数组中每个“插槽”的第一个字符。这是我的代码:
#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");
}
现在,我必须澄清一下,我知道我在 printf()
(Ln 48) 中使用 %c
而不是 %s
,但是如果我把 %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()
循环方式
您不需要取消引用指针,您可以传递 dpb[0][0]
而不是 dbp[0][0][0]
的地址。
您可能想研究使用 struct
s 而不是 multi-dimensional 数组,这将使逻辑简单得多。
#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");
}