由于某种原因,数组中的第二个元素(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]);
    }
}