gpt4 book ai didi

c - 如何将数组传递给 C 中的函数(在 Fedora 上)?

转载 作者:行者123 更新时间:2023-11-30 14:57:43 27 4
gpt4 key购买 nike

自从我是初学者以来,我一直在练习将数组作为参数传递给函数。有人可以解释一下为什么我写的这个程序在 codeblox 上运行良好,但在 Fedora 终端上不起作用(在 Fedora 上它不适用于任何数量的分数)。我正在使用 GCC 编译器。

#include<stdio.h>
int num,scores[]={},count,max,sum;
void input(int scores[]);
int findmax(int scores[]);
int findsum(int scores[]);
void display(int max,int sum);

int main()
{
printf("Enter number of scores\n");
scanf("%d",&num);

input(scores);
max=findmax(scores);
sum=findsum(scores);
display(max,sum);
return 0;
}

void input(int scores[])
{
for(count=0; count<num; count ++)
{
printf("Enter score #%d:\n",count);
scanf("%d",&scores[count]);
}

}

int findmax(int scores[])
{
for(count=0; count<num ; count ++)
{
if(scores[count]>max)
{
max=scores[count];
}

}
return max;
}

int findsum(int scores[])
{ sum=0;
for(count=0; count<num ; count++ )
{
sum=sum+scores[count];
}
return sum;
}

void display(int max,int sum)
{
printf("The max score is :%d\nThe total score is:%d\n",max,sum);
}

最佳答案

除非绝对需要,否则您应该避免使用全局变量。这里不需要任何东西。所有值都应声明为 main 的本地值,并应根据需要作为参数传递给每个函数。

您必须至少通过检查 scanf(或您正在使用的任何输入函数)的返回来验证所有输入。如果用户只是按 Enter(生成 '\n')或输入单词而不是数字,导致转换失败,那么您就已经死在水里了,很可能会被看着无限循环滚动,直到杀死进程。 (猫可能会踩到键盘等)

使用 scanf 系列函数时,如果发生故障,您必须考虑输入缓冲区中剩余的任何字符(例如 stdin) > 与 scanf)。如果在循环内调用 scanf,则会面临无限循环的风险,转换失败,输入缓冲区中的相同字符只能再次读取,然后一遍又一遍地失败。

如果您不验证您的输入,您就无法确信自己正在处理从该点开始的有效输入,并且实际上可能会陷入未定义行为scanf 系列函数根据格式字符串 中包含的格式说明符 数量返回有效转换的数量。因此,对于 "%d",您有一个格式说明符(例如 %d),因此成功转换后,返回将是 1 (如果用户使用 Ctrl + dCtrl + z 手动取消输入,您还应该检查 EOF Windoze——留给你)

将这些部分放在一起,您可以执行如下操作:

#include <stdio.h>
#include <limits.h> /* for INT_MIN */

#define MAX 512

void input (int *scores, int num);
int findmax (int *scores, int num);
int findsum (int *scores, int num);
void display (int max, int sum);

int main (void)
{
int num, scores[MAX] = { 0 }, max, sum;

printf ("Enter number of scores: ");
if (scanf ("%d", &num) != 1) { /* VALIDATE ALL input */
fprintf (stderr, "error: invalid integer input.\n");
return 1;
}

input (scores, num);
max = findmax (scores, num);
sum = findsum (scores, num);
display (max, sum);

return 0;
}

void input (int *scores, int num)
{
int count = 0;

while (count < MAX && count < num) { /* always protect array bounds */
printf ("Enter score [%d]: ", count);
while (scanf ("%d", &scores[count]) != 1) { /* VALIDATE input */
fprintf (stderr, "error: invalid input, try again.\n");
/* remove invalid chars from input buffer */
for (int c = getchar(); c != '\n' && c != EOF; c = getchar()) {}
goto badval;
}
count++;
badval:;
}
}

int findmax (int *scores, int num)
{
int max = INT_MIN, count;

for (count = 0; count < num; count++)
if (scores[count] > max)
max = scores[count];

return max;
}

int findsum (int *scores, int num)
{
int sum = 0, count;

for (count = 0; count < num; count++)
sum = sum + scores[count];

return sum;
}

void display (int max, int sum)
{
printf ("\nThe max score is :%d\nThe total score is:%d\n", max, sum);
}

示例使用/输出

$ ./bin/maxminsum
Enter number of scores: 5
Enter score [0]: 9
Enter score [1]: 3
Enter score [2]: 7
Enter score [3]: 8
Enter score [4]: 2

The max score is :9
The total score is:29

具有纠错功能

$ ./bin/maxminsum
Enter number of scores: 5
Enter score [0]: 9
Enter score [1]: 3
Enter score [2]: foo
error: invalid input, try again.
Enter score [2]: 7
Enter score [3]: 8
Enter score [4]: bar
error: invalid input, try again.
Enter score [4]: 2

The max score is :9
The total score is:29

如果您还有其他问题,请发表评论。

关于c - 如何将数组传递给 C 中的函数(在 Fedora 上)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43703779/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com