该代码试图获得3名学生的名字和他们的成绩在3个科目和打印总分以及平均分的每个学生沿着他们的名字。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int main() {
char *names[3];
int test1[3],test2[3],test3[3];
for(int i=0;i<3;i++)
{
scanf("%s",&(*(names+i)));
scanf("%d",&test1[i]);
scanf("%d",&test2[i]);
scanf("%d",&test3[i]);
}
int j=0;
while(j<3){
printf("%s",*(names+j));
printf(" %d ",test1[j]+test2[j]+test3[j]);
printf("%.f\n",(test1[j]+test2[j]+test3[j])/3.0);
j++;
}
return 0;
}
但是当我运行这段代码时,我没有得到while循环中的printf的输出,有人能帮帮我吗?
2条答案
按热度按时间ux6nzvsh1#
变量
names
是一个指针数组,但是你从来没有让这些指针指向任何地方,任何试图去引用它们的行为都会导致 undefined behavior。另外
&names[i]
的类型(&(*(names+i))
的实际类型)是char **
,这 * 不是 *scanf``%s
所期望的。格式说明符和参数类型不匹配 * 也 * 导致未定义的行为。您应该使用的是一个由 *arrays * 字符组成的数组:
并使子数组衰减到指向其第一元素的指针(表达式
names[i]
衰减到具有类型char *
的&names[i][0]
):注意,我添加了一个长度说明符,以避免超出
names[i]
的范围。然后打印为普通字符串:
eufgjt7s2#
对于初学者来说,你包含了太多的标题。
实际上,程序中只使用了头文件
<stdio.h>
的声明,所以去掉所有其他头文件,只留下头文件<stdio.h>
在本声明中
声明了具有不确定值指针的未初始化数组。
所以这个scanf的调用
至少应该写成
因为表达式
&(*(names+i))
具有类型char **
,但是函数期望类型char *
的参数,所以调用未定义的行为。要存储字符串,您需要声明字符数组的数组,例如
但无论如何,声明四个数组的方法看起来并不好。
最好将结构声明为
在这种情况下,您只能声明一个包含三个
struct Student
类型对象的数组。这是一个演示程序
程序输出可能如下所示