【问题标题】:Array: issues declaring数组:问题声明
【发布时间】:2019-08-14 21:56:34
【问题描述】:

我一直在尝试将我的 python 转换为 C 代码,这是我第一次使用 C。

基本上我希望它询问我将输入多少个分数,然后将它们放入一个数组中。问题是数量不断放入数组中。我以为我可以在询问我输入的成绩后声明数组的大小,但我认为这就是问题所在。我不知道该怎么做。我有很多 printfs 用于调试。

有什么建议吗?

double enter_quiz_grades()
{

    int quiz_amount,loop,i;
    printf("Enter number of quiz grades to enter:");
    scanf(" %d \n", &quiz_amount);
    printf("You typed %d students\n",quiz_amount);
    double temp=0;
    double grades[quiz_amount];

    for (loop = 0; loop<quiz_amount;loop++)
    {
        printf("loop is %d", loop);
        i = loop+1;
        printf("Enter grade for quiz %d: ",i);
        scanf("%lf\n", &temp);
        grades[loop] = temp;
        printf("%lf",grades[loop]);
    }
    return 0.0; 
}

【问题讨论】:

  • 问题是scanf中的“\n”。在所有 scanfs 中删除 \n。它会按您的预期工作。
  • 你不需要temp变量,可以直接扫描到数组中:scanf("%lf", &amp;grades[loop])
  • 就目前而言,您实际上并不需要 grades 数组。如果您稍后打算“返回成绩”,您将遇到几个问题,其中之一是return grades; 将尝试返回指向函数退出后不再有效的局部变量的指针。另一个问题是如何与调用代码通信数组中有多少条目。这些问题是可以解决的——例如,使用malloc() 和指向长度变量的指针进行动态内存分配——但很容易误入歧途。

标签: c arrays for-loop


【解决方案1】:

问题是你在 scanf 中使用了 '\n'。您也可以摆脱其他变量。 这是修改后的代码:

double enter_quiz_grades() {

    int quiz_amount, i;
    printf("Enter number of quiz grades to enter:");
    scanf("%d", &quiz_amount);
    printf("You typed %d students\n",quiz_amount);
    double temp = 0;
    double grades[quiz_amount];

    for (i = 0; i < quiz_amount; i++)
    {
        printf("loop is %d\n", i);
        printf("Enter grade for quiz %d: ", i + 1);
        scanf("%lf", &grades[i]);
        printf("%lf\n",grades[i]);
    }

    return 0.0;
}

【讨论】:

  • 非常感谢你们,像我一样声明数组也可以吗?
【解决方案2】:

只是一个小细节,与原始问题没有严格的关系:

double grades[quiz_amount];

这会从一个变量创建一个在运行时调整大小的数组。如果这个变量是从某个地方读取的,这可能会导致恶意用户给它一个非常高(或负数!)的值,你就会遇到大问题。出于这个确切原因,Linux 内核正在从源中删除它们(因为这种语法在堆栈中创建了数组 - 攻击者可以修改返回地址)。将其设为在堆上分配的动态数组 (malloc())。

https://www.phoronix.com/scan.php?page=news_item&px=Linux-Kills-The-VLA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多