是否可以在二维数组中输入 2 种数据类型?

时间:2020-12-25 13:46:01

标签: arrays c loops

因此,我被要求编写一个程序,该程序获取学生姓名和分数的列表并计算平均分数。您需要声明两个名为名称和标记的数组。假设学生人数为 5。

声明数组名:(使用二维数组) 字符名称[num_std][name_len]; //名称长度可以是20个字符

声明数组标记: 浮动标记[num_std];

让我烦恼的是,当我尝试运行调用名称和标记的循环时,我不知道为什么会得到空值。而且我也想知道以这种方式对我的二维数组进行编码是否正确? 抱歉,我对二维数组还是个新手,这让我很困惑。

有人可以给我写一个完整的代码,因为我想指出我错在哪里。 非常感谢:D

///////////////////////代码////////////////////// /

#include <stdio.h>

int main ()
{
    int n,i;
    char num_std;
    char name_len[20];
    char name[num_std][name_len[20]];
    float sum = 0,marks [5];
    for (n=0;n<5;n++)
    {
        printf("\nEnter student name:");
        scanf("%s",&name[n][1]);

        printf("Enter student marks:");
        scanf("%f",&marks[n]);
        sum += marks[n];
    }

        for(n=1;n<5;n++)
        {
        printf("%s %f",name[n][1],marks[n]);
         }

    float average = sum/5.0;
    printf("\nAverage mark of 5 students = %.2f",average);
    
    return 0;
    }

//////////////////输出///////////////////////

Enter student name:Brian
Enter student marks:99

Enter student name:Edward
Enter student marks:79

Enter student name:Fred
Enter student marks:69

Enter student name:Adrian
Enter student marks:45

Enter student name:Smith
Enter student marks:55
(null) 45.000000
Average mark of 5 students = 69.40
Process returned 35 (0x23)   execution time : 40.064 s
Press any key to continue.

2 个答案:

答案 0 :(得分:1)

你的代码是如何出错的:

#include <stdio.h>

int main ()
{
    /* i is declared but not used (legal) */
    int n,i;
    char num_std;
    char name_len[20];
    /* uninitialized variable num_std is used as array length (critical) */
    /* out-of-range name_len[20] is used (critical) */
    char name[num_std][name_len[20]];
    float sum = 0,marks [5];
    for (n=0;n<5;n++)
    {
        printf("\nEnter student name:");
        /* the first element of the array name[n] is not used (legal) */
        scanf("%s",&name[n][1]);

        printf("Enter student marks:");
        scanf("%f",&marks[n]);
        sum += marks[n];
    }

    /* indentation is broken (legal) */
        /* the first data is not printed (legal) */
        for(n=1;n<5;n++)
        {
        /* char (name[n][1]) is passed where char* is required (critical) */
        /* data is printed without being separated (legal) */
        printf("%s %f",name[n][1],marks[n]);
         }

    float average = sum/5.0;
    /* newline character is not printed at end of output (legal) */
    printf("\nAverage mark of 5 students = %.2f",average);
    
    return 0;
    /* but indentation is broken (legal) */
    }

这里的“关键”意味着错误会引发未定义行为,“合法”意味着错误不会引发未定义行为但行为可能不是什么想要或不典型。

固定代码:

#include <stdio.h>

int main (void)
{
    int n;
    char name[5][21]; /* 20-character name + 1 terminating null-character */
    float sum = 0,marks [5];
    for (n=0;n<5;n++)
    {
        printf("\nEnter student name:");
        scanf("%20s",name[n]); /* specify length limit to avoid buffer overrun */

        printf("Enter student marks:");
        scanf("%f",&marks[n]);
        sum += marks[n];
    }

    for(n=0;n<5;n++)
    {
        printf("%s %f\n",name[n],marks[n]);
    }

    float average = sum/5.0;
    printf("\nAverage mark of 5 students = %.2f\n",average);
    
    return 0;
}

答案 1 :(得分:0)

char name[num_std][name_len[20]]; 是错误的。 name_len 是一个包含 20 个元素的数组,因此这些元素的索引范围为 0 到 19。访问 name_len[20] 是不正确的。此外,此时 name_len 中的任何元素都没有被赋予值。 C 标准允许在程序执行期间设置长度的数组,但必须在定义数组时给出长度。它不能是一个随着变量变化而调整的长度。在您学习的这一点上,将长度更改为给定的最大值:char name[num_std][21];。 21 个数组元素(每个元素一个 char)允许名称中有 20 个字母加上一个空字符来标记结尾。 (稍后您将学习管理多个不同长度的字符串的其他方法。)

您还需要在此定义之前给 num_std 一个值。目前尚不清楚该值应该是多少。程序的其他部分是为五个学生硬编码的。在这种情况下,您可以使用 num_std 定义 char num_std = 5;。在这样的分配中,程序通常会首先从输入中读取 num_std。在这种情况下,您需要在 scanf 行之前使用 num_std 来读取 char name[num_std][21];

scanf("%s",&name[n][1]); 是错误的。我们想将字符串放在名称空格的开头,该空格以 name[n][0] 开头,而不是 name[n][1]。所以你可以使用&name[n][0]。表达式 name[n] 将具有相同的值,因为在 C 中,表达式中的数组会自动转换为指向其第一个元素的指针(除非用作 sizeof 的操作数或一元 {{1 }} 或作为初始化数组的字符串字面量)。

& 中,您还应该使用 printf("%s %f",name[n][1],marks[n]);,并且您再次需要传递其地址,name[n][0]&name[n][0]

相关问题