【问题标题】:While loop with fscanf使用 fscanf 循环
【发布时间】:2015-01-30 10:03:26
【问题描述】:
int* data=(int*)malloc(size*sizeof(int));
int i=0,tmp;
while(fscanf(m,"%d",&tmp)!=EOF)data[i++]=tmp;

为什么它起作用而不是这个? :

int* data=(int*)malloc(size*sizeof(int));
int i=0;
while(fscanf(m,"%d",data[i++])!=EOF);

【问题讨论】:

  • 您的 while 循环条件不正确。如果fscanf 失败(返回0),则data[i] 将保持未分配状态。
  • 因为您没有阅读您使用的语言功能的文档。
  • 除其他外,如答案中所示...始终检查 malloc (!=NULL) 的返回值以确保操作成功。在 C 语言中,从 malloc(和系列)转换返回值是一个坏主意(可能导致细微的程序错误)。注意: malloc 的返回值是 (void *) 所以它会自动变成正确的类型,(没有任何转换)

标签: c memory malloc scanf


【解决方案1】:

主要:传递地址&,而不是值。

// fscanf(m,"%d",data[i++])
fscanf(m,"%d", &data[i++])

其他:

  • 检查 1,而不是 EOF
  • 测试指标限制
  • 将数组索引视为类型size_t
  • 无需转换malloc() 的结果。
  • 考虑 malloc 样式 type *var = malloc(size * sizeof *var)

    int *data = malloc(size * sizeof *data);
    size_t i=0;
    while(i < size  &&  fscanf(m,"%d", &data[i++]) == 1);
    

【讨论】:

    【解决方案2】:

    你需要传递地址:

    while(fscanf(m,"%d",&data[i++])!=EOF);
    

    检查i &lt; size 是否也是一个好主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      相关资源
      最近更新 更多