由于某种原因,数组中的第二个元素(int 数组)未在外部函数中处理
2nd element in array (int array) isn't being processed in outside function for some reason
我是编程新手,刚开始学习结构。我正在制作一个程序,要求提供学生姓名、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", i+1, 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", i+1, marks[i]);
}
}
我是编程新手,刚开始学习结构。我正在制作一个程序,要求提供学生姓名、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", i+1, 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", i+1, marks[i]);
}
}