仅使用 stdio 库时,简单的“for”命令不起作用

A simple "for" command doesnt work using only the stdio library

提问人:John 提问时间:12/21/2012 最后编辑:CommunityJohn 更新时间:12/27/2012 访问量:119

问:

使用与我的另一个问题中提到的相同的机器和 IDE(代码问题或我的 IDE/comp 被窃听的第三段?)

我尝试运行以下代码:

#include <stdio.h>
#define n 3
int main()
{
    int i;
    float values[n],sumval,svmean,tmp;
    for(i=0;i<n;++i)
    {
        scanf("%f",&tmp);
        values[i]=tmp;
        sumval = sumval + values[i];
    }
    svmean = sumval/n;
    printf("%f \n",svmean);
    return(0);
}

上面的代码应该运行这个公式

http://img850.imageshack.us/img850/6894/95871186.jpg

这意味着它必须添加一些值并将结果除以它们的总数。

正如你在上面看到的,我制作了一个具有随机位置的数组,我要求用户为每个位置填写一个值,然后将它们全部相加并除以。n

问题是它不起作用。无论 iput 是什么,它都只输出结果 7。

但是,如果我将 stdlib.h 包含在代码中,它可以正常工作。

所以

  • 问题 A:为什么代码不能正常工作,只使用 stdio.h 库?代码的哪个元素需要 stdlib.h 图书馆?

如您所见,该数组似乎具有随机数量的单元格,但实际上我已经将此数字设置为等于 3(使用values[n]n#define)

  • 问题 B:有没有办法运行具有相同孔的代码,但让用户定义数组的大小,或者换句话说,让用户输入一个设置 in 值的整数?values[n]nvalues[n]
C std stdio 动态数组

评论


答:

2赞 piokuc 12/21/2012 #1

首先,你忘了初始化。你希望它出现在开头。sumval0

如果您希望在运行时决定数组的大小,则必须使用 动态分配它,例如,如下所示:malloc

int n;
float *values,sumval=0,svmean,tmp;
scanf("%d", &n);
values = (float *) malloc (n * sizeof(float));

稍后,您应该通过调用以下命令来释放分配的内存:free

free(values);

评论

0赞 John 12/21/2012
我在相同代码的其他试验中这样做了,但它似乎没有改变任何东西(我想编译器接受 sumval 默认值为 0),即使没有使用 stdlib.h 初始化 sumval,它也能正常工作。感谢您的回复。
2赞 piokuc 12/21/2012
@John猜错了。 是一个自动变量(在堆栈上分配),这意味着它不能保证被初始化为任何特定值,它通常会包含一些“垃圾”。sumval
0赞 Vallabh Patade 12/21/2012 #2

将 sumVal 初始化为 o。因为在第一次迭代中,它会将 garbage+values[i] 添加到 sumValue 中。

 #include <stdio.h>
 #define n 3
 int main()
 {
 int i;
 float values[n],sumval=0,svmean,tmp;
 for(i=0;i<n;++i){
 scanf("%f",&tmp);
 values[i]=tmp;
 sumval = sumval + values[i];
 }
  sumean = sumval/n;
  printf("%f \n",svmean);
  return(0);

}

0赞 Didier Trosset 12/21/2012 #3

问题是你没有初始化。您应该将其设置为 before you loop。sumval0.0for

包含/不包含时发生的更改可能是由于某些初始化函数使用堆栈,并在输入函数之前更改了内存中的值,并且碰巧此内存用于变量。stdio.hsumval

但你不应该依赖这个。

0赞 Genís 12/21/2012 #4

您可以在程序堆中分配一个大小可变的数组,如下所示:

#include <stdio.h>
int main(int argc, char **argv)
{
   int i;
   //Get the size of the array from input parameter
   int n = atoi(argv[1]);                
   float sumval,svmean,tmp;
   //Allocate the array of values
   float *values = malloc(sizeof(float)*n);
   // Initialize sumval
   for(sumval=0,i=0;i<n;++i){
      scanf("%f",&tmp);
      values[i]=tmp;
      sumval = sumval + values[i];
   }
   svmean = sumval/n;
   printf("%f \n",svmean);
   //Free it
   free( values );               
   return(0);
  }

您还需要将 sumval 初始化为 0。数组大小的参数在启动程序时传递(如果您使用 IDE,则应检查它是如何执行的)

评论

0赞 John 12/23/2012
Genis 感谢您的代码...但是 1) 我无法让它运行......首先,调试器要求定义 n var,并且需要一个“;”,在第 9 行我定义了 n,但同样什么都没有......2) Main 中的 paremeters 到底是什么?此外,没有用于获取数组大小的 scanf。.我也添加了一个,但它再次不起作用..
0赞 Genís 12/27/2012
好吧,你是对的,我留下了一个“;”,没有声明“n”,但这些都是微不足道的更正,不是吗?在涉及获取数组大小的 scanf 方面,它不会扫描它,而是从命令行中的参数获取它,但您可以根据需要更改它。
0赞 nick.katsip 12/21/2012 #5

问题 A 答案在您发布的代码中,不需要 stdlib.h。如果您使用动态分配内存的函数(例如 malloc(),则需要此库。

问题B答案:这是一种做你想做的事的方法:

#include <stdio.h>

int main()
{
    int i, choice;
    float *values,sumval,svmean,tmp;
    printf("Please enter the size of the array: ");
    scanf("%d", &choice);
    values = (float*) malloc(choice*sizeof(float));
    for(i=0;i<n;i++){
        scanf("%f",&tmp);
        values[i]=tmp;
        sumval = sumval + values[i];
    }
    svmean = sumval/n;
    printf("%f \n",svmean);
    free(values);
    return 0;
}

此外,我修改了 for 语句中 i 的增量,使其在运行循环后增加。

评论

1赞 John 12/21/2012
谢谢 popanik,我看到您正在使用指针,我几乎不记得任何关于它们的“机制”的信息......运行您的代码会导致我的 GNU GCC 编译器在 Windows 的第 10 行出现错误“ error: 'n' undeclared (在此函数中首次使用) ||=== 构建完成:1 个错误,4 个警告(0 分 0 秒)===|
0赞 John 12/23/2012
它似乎没有在第 10 行和第 15 行运行“错误:'n' 未在此范围内声明 ”:/
0赞 nick.katsip 12/23/2012
是的,约翰。我的错。实际上,我使用变量选择而不是 n。因此,在发生错误的行中,只需将 n 替换为 choice,一切正常即可。
0赞 Ajith 12/24/2012 #6

试试这个..

#include <stdio.h>

int main()
{
    int i = 0;
    int n = 0;
    float sumval = 0;
    float svmean = 0;
    float tmp = 0;

    printf("Enter count : ");
    scanf("%d", &n);

    for (i = 0; i < n; ++i) {
        scanf("%f", &tmp);
        sumval = sumval + tmp;
    }

    svmean = sumval/n;
    printf("%f \n",svmean);

    return(0);
}

在代码中,values[] 数组不是计算输出所必需的。您是否出于任何原因存储这些值??..