字符串突然在函数内失去其值

时间:2015-09-07 07:59:10

标签: c arrays string

我的代码应该从文件中读取文件名,打开文件名并进行一些计算。这些文件包含数据列。我已经声明了数组来读取数据。当我在读入之前初始化数组时,包含文件名的字符串表现得不稳定。如果删除了初始化,问题就解决了。

不稳定的行为是:首先声明的字符串不会留在内存中。在代码中,如果我先声明d[90],则稍后的print语句不会打印先前保存的值。可能是什么原因?

以下是代码:

#include<stdio.h>
#include<math.h>

main()
{

  FILE *data,*model,*filenames;

  int i,imax,j,k,l;
  float fd[1000],fm[1000],td[1000],tm[1000];
  float a;
  char d[90],m[90];


  k=1;
  l=0;

  filenames=fopen("filenames.dat","r");


  while(fscanf(filenames,"%s %s",d,m)!=EOF)
   {
printf("model: %s\ndata: %s\n",m,d);

    for(i=1;i<=1000;i++)
      {
        fd[i]=0;
        fm[i]=0;
        td[i]=0;
        tm[i]=0;
      }


printf("datafile name: %s\n",d);
printf("modelfile name: %s\n",m);

    data=fopen(d,"r");

    for(i=1;i<=1000;i++)
      if(fscanf(data,"%f %f %f %f",&td[i],&fd[i],&a,&a)!=EOF)
        k++;
      else
        break;

    fclose(data);

printf("modelfile name: %s\n",m);
    model=fopen(m,"r");

    for(i=1;i<=1000;i++)
      if(fscanf(model,"%f %f %f %f %f %f",&tm[i],&fm[i],&a,&a,&a,&a)!=EOF)
       l++;
      else
        break;

    fclose(model);


   }

}

1 个答案:

答案 0 :(得分:6)

在您的代码中,使用import java.lang.reflect.ParameterizedType; public class ParametrizedStuff { @SuppressWarnings("unchecked") interface Awesomable<T> { default Class<T> parameterizedType() { return (Class<T>) ((ParameterizedType) this.getClass().getGenericInterfaces()[0]) .getActualTypeArguments()[0]; } } static class Beer {}; static class EstrellaGalicia implements Awesomable<Beer> {}; public static void main(String[] args) { System.out.println("Type is: " + new EstrellaGalicia().parameterizedType()); // --> Type is: ParameterizedStuff$Beer } 等定义,使用float fd[1000]循环

for

创建off-by-one error,因此导致undefined behaviour,实际上,您尝试访问已分配的内存。

for(i=1;i<=1000;i++) { fd[i]=0; fm[i]=0; td[i]=0; tm[i]=0; } 使用基于C的索引时,您应该使用00的索引来获取具有(size-1)元素的数组。

此外,请始终针对size检查fopen()的返回值,以确保其成功。如果NULL失败,使用返回的指针将再次调用UB。