【问题标题】:C "for" loop iterating only onceC“for”循环只迭代一次
【发布时间】:2017-06-17 19:04:19
【问题描述】:

对于上下文,我正在尝试用 C 编写解决 this problem 的代码。

问题比较简单。第一个输入是一个整数,表示分数流中的分数数量。以下输入都是代表分数的整数。程序应该读取分数流并返回两个值:最高分记录被打破的次数,以及最差记录被打破的次数。

我已经写下了这个解决方案。

#include <stdio.h>

int getRecord(int n, int s[], int *max_records, int *min_records)
{
    int max_score, min_score;
    max_score = min_score = s[0];

    for (int i = 1; i < n; i++)
    {
        if (s[i] > max_score)
        {
            (*max_records)++;
            max_score = s[i];
        }
        if (s[i] < min_score)
        {
            (*min_records)++;
            min_score = s[i];
        }

        printf("%d %d\n", max_score, min_score);  // inserted to see values
        return 0;
    }
}

int main(char args[])
{
    int n;
    scanf("%d", &n);
    int s[n];
    for (int i = 0; i < n; i++)
        scanf("%d", &s[i]);
    int max_records = 0;
    int min_records = 0;

    getRecord(n, s, &max_records, &min_records);
    printf("%d %d\n", max_records, min_records);
}

由于某种原因,无论我使用什么输入,for 循环都只会在程序运行时迭代一次。

【问题讨论】:

  • main() 函数只有两个有效签名:int main( void )int main( int argc, char *argv[] ) 发布的代码有:int main( cgar args[] 与任何有效签名都不匹配。所以编译器抱怨签名。然后编译器继续抱怨没有使用参数args
  • 函数:getRecord() 在始终执行的for() 循环中间有一个return 语句。并且在最后的 } 之前没有 return value 语句
  • 在调用任何scanf() 系列函数时,始终检查返回值(而不是参数值)以确保操作成功
  • 为什么 getRecords() 的返回类型不是 void,因为没有返回有用的信息,并且在 main() 中的调用忽略了返回值?
  • 当希望用户输入一些值时,总是提示用户,然后验证输入。 IE。永远不要相信用户会做正确的事情,尤其是(如在发布的代码中)用户只能看着一个空白屏幕,光标闪烁,并且没有指示他们应该做什么。

标签: c pointers for-loop


【解决方案1】:

你的循环中有return 0

改成:

for (int i = 1; i < n; i++)
{
    if (s[i] > max_score)
    {
        (*max_records)++;
        max_score = s[i];
    }
    if (s[i] < min_score)
    {
        (*min_records)++;
        min_score = s[i];
    }

    printf("%d %d\n", max_score, min_score);  // inserted to see values
}
return 0;

【讨论】:

  • 谢谢。我有一种感觉,像这样很愚蠢。