问题描述
我是编程的新手,开始学习结构。我正在编写一个程序,要求输入学生姓名,3个测试结果,然后将这些结果通过一个摆脱最低分的函数传递。
当我出于某种原因将其传递给该函数时,它只是不显示第二个元素,而是将其替换为第三个元素,而将第三个元素替换为0。
我更改了代码以显示我的意思。如果您愿意复制并粘贴以了解我的意思。任何帮助将不胜感激。
#include <stdlib.h>
#define SIZE 1
#define TESTS 3
typedef struct
{
char name[50];
int test[TESTS];
float avg;
}Results;
void best(Results *marks[TESTS]);
int main()
{
Results nameArr[SIZE];
for(int i=0; i<SIZE; i++)
{
printf("Enter name for student %d: ",i+1);
scanf("%\s",nameArr[i].name);
printf("Enter marks (Out of 100) for %s:\n",nameArr[i].name);
for(int j=0; j<TESTS; j++)
{
printf("Test %d: ",j+1);
scanf("%d",&nameArr[i].test[j]);
}
}printf("\n");
for(int i= 0; i<TESTS; i++)
{
printf("Test %d in main() = %d\n",i+1,nameArr[0].test[i]);
}printf("\n");
for(int i= 0; i<SIZE; i++)
{
best(&nameArr[i].test);
}
printf("\n");
system("PAUSE");
return 0;
}
void best(Results *marks[TESTS])
{
for(int i= 0; i<TESTS; i++)
{
printf("Test %d in function = %d\n",marks[i]);
}
}
解决方法
正如MikeCAT在评论中指出的那样,您正在使用printf()语句调用未定义的行为。类型“%d”的参数需要一个十进制值,但是您给它提供了一个指向“%p”参数的结构的指针。我建议您在这里研究printf()函数:https://www.tutorialspoint.com/c_standard_library/c_function_printf.htm
这将帮助您更好地了解如何使用它来准确,适当地打印您想要看到的值。
, nameArr[i].test
的类型是int[TESTS]
,而不是Results*[TESTS]
。为函数参数使用正确的类型。
表达式中的数组也将自动转换为指针(存在某些例外),因此您不需要在数组之前使用&
(至少在这种情况下)。
其他几点:
- 您应该添加
#include <stdio.h>
才能使用printf()
和scanf()
。 -
\s
是无效的转义序列。您应该使用"%s"
而不是"%\s"
。
#include <stdio.h> /* add this */
#include <stdlib.h>
#define SIZE 1
#define TESTS 3
typedef struct
{
char name[50];
int test[TESTS];
float avg;
}Results;
/* fix argument type */
void best(int marks[TESTS]);
/* void best(Results *marks[TESTS]); */
int main()
{
Results nameArr[SIZE];
for(int i=0; i<SIZE; i++)
{
printf("Enter name for student %d: ",i+1);
/* remove invalid escape sequence */
scanf("%s",nameArr[i].name);
/* scanf("%\s",nameArr[i].name); */
printf("Enter marks (Out of 100) for %s:\n",nameArr[i].name);
for(int j=0; j<TESTS; j++)
{
printf("Test %d: ",j+1);
scanf("%d",&nameArr[i].test[j]);
}
}printf("\n");
for(int i= 0; i<TESTS; i++)
{
printf("Test %d in main() = %d\n",i+1,nameArr[0].test[i]);
}printf("\n");
for(int i= 0; i<SIZE; i++)
{
/* remove & */
best(nameArr[i].test);
/* best(&nameArr[i].test); */
}
printf("\n");
system("PAUSE");
return 0;
}
/* fix argument type */
void best(int marks[TESTS])
/* void best(Results *marks[TESTS]) */
{
for(int i= 0; i<TESTS; i++)
{
printf("Test %d in function = %d\n",marks[i]);
}
}