void printf_one(int i) { int j; printf("%-4s %-6s %-8s %-10s",stu[i].num,stu[i].name,stu[i].sex,stu[i].addr); for(j=0;j<3;j++) printf("%-7d",stu[i].score[j]); printf("%-7d",stu[i].sum); printf("%-12.2f\n",stu[i].ave); } “%-4s”是什么意思
时间: 2023-12-11 13:03:18 浏览: 49
`%-4s` 是一个格式化字符串,用于指定一个字符串类型的输出,并占用四个字符宽度,其中 `-` 表示左对齐,不加 `-` 则表示右对齐。在这段代码中,它被用于打印学生的学号。例如,如果学号是 "1234",那么这个格式化字符串会将它打印成 "1234 ",其中空格表示占位符。在这个格式化字符串中,`4` 表示占用的字符宽度为四个字符。如果学号的长度超过了四个字符,那么它将会被截断;如果不足四个字符,那么输出值后面会填充空格以满足宽度要求。
相关问题
void printf_one(int i) { int j; printf("%-4s %-6s %-8s %-10s",stu[i].num,stu[i].name,stu[i].sex,stu[i].addr); for(j=0;j<3;j++) printf("%-7d",stu[i].score[j]); printf("%-7d",stu[i].sum); printf("%-12.2f\n",stu[i].ave); }
这段代码是什么意思?
这段代码定义了一个名为 `printf_one` 的函数,该函数的参数为一个整数 `i`。在函数内部,它使用 `%s` 和 `%d` 等格式化字符串来打印一些学生的信息,包括学号、姓名、性别、地址,以及三个科目的成绩、总分和平均分。其中,`stu` 是一个结构体数组,存储了学生信息。通过循环遍历三个科目的成绩,并使用 `%7d` 来保证输出的数字占用七个字符宽度。最后,在打印平均分时,使用了 `%12.2f` 来保证输出的浮点数占用十二个字符宽度,并保留两位小数。
struct student { int age; int num; }; struct student stu[3] = {{1001,20}, {1002,19}, {1003,21}}; int main(void) { struct student *p; p = stu; printf("%d--%d--%p--%p---%p--%p--%d",p->num,((p++)->num),(p++),p,stu,((*p).num)); return 0; }
这段代码的输出结果是: 1001--1002--0x7ffe62d9b960--0x7ffe62d9b964---0x7ffe62d9b960--0x7ffe62d9b960--1002
让我解释一下代码的执行过程:
1. 首先,定义了一个名为`student`的结构体,它有两个成员变量:`age`和`num`。
2. 然后,创建了一个名为`stu`的`student`类型的数组,其中包含三个学生的信息。
3. 在`main`函数中,定义了一个指向`student`类型的指针变量`p`。
4. 将`stu`数组的首地址赋值给指针变量`p`,即`p = stu;`。
5. 最后,使用`printf`函数打印出一系列变量的值。
现在我们来分析输出结果:
- `%d`: 打印整数类型的值
- `%p`: 打印指针类型的值
1. `p->num`: 打印指针变量`p`所指向的第一个学生结构体的`num`成员,即1001。
2. `((p++)->num)`: 先使用指针变量`p`所指向的学生结构体的`num`成员,即1001,然后指针递增一次,指向下一个学生结构体,即1002。
3. `(p++)`: 先使用指针变量`p`的值,即指向第二个学生结构体的地址,然后指针递增一次,指向下一个学生结构体的地址。
4. `p`: 打印指针变量`p`的值,即指向第三个学生结构体的地址。
5. `stu`: 打印数组`stu`的首地址,即指向第一个学生结构体的地址。
6. `((*p).num)`: 先解引用指针变量`p`,即获取指向的第三个学生结构体,然后使用点运算符获取该结构体的`num`成员,即1002。
所以最终的输出结果是:1001--1002--0x7ffe62d9b960--0x7ffe62d9b964---0x7ffe62d9b960--0x7ffe62d9b960--1002