1

我的代码出现段错误,我不知道为什么。我通读一个文件并计算行数,以便动态分配我的数组。然后我倒带文件,读取文件中的数据,将数据存储到变量中,然后将读取的变量存储到数组中,但是我遇到了字符问题。

   ...
   char *aname = malloc(sizeof(char) * 3); 
   ... 
   // get # lines in file (count)
   ... 
   char *aname_seen = malloc(count * (sizeof(char) * 3));
   ...
   rewind(file);
   while (fgets(buff, sizeof buff, file) != NULL) 
   {
      if (sscanf(buff, "%s %d %s %s %d %lf %lf %lf %lf %lf\n", 
         atm, &serial, aname, resName, &resSeq, &x, &y, &z, 
         &occupancy, &tempFactor) == 10)
      {
         aname_seen[i] = *aname;
         printf("%d: %s vs %s\n", i, aname, aname_seen[i]);

         i++;

      } // end sscanf if-loop

   } // end while loop

我可以打印 anameprintf("%d: %s\n", i, aname)并获得预期的输出,但是Segmentation fault (core dumped)当我尝试printf("%d: %s vs %s\n", i, aname, aname_seen[i]).

这个 while 循环 + 嵌套 if 循环与我用来计算行数的约定相同,因此i将递增到 count。我是否错误地分配了 aname_seen 而实际上并没有给它提供元素count数量?char*3我不太擅长弄乱char。更多的数字fortran buff,所以我需要一些指导。

提前致谢!

4

2 回答 2

3

格式说明%s符应该对应于一个char *参数。在您的情况下,aname_seen[i]是 a char,它被提升为 anint以传递给可变参数函数 ( printf)。一个int不是一个char *

也许您的意思是其中之一:

printf("%d: %s vs %c\n", i, aname, aname_seen[i]);
printf("%d: %s vs %s\n", i, aname, &aname_seen[i]);

如果这些都不能解决你的问题,请准确解释你期望从这个表达式中得到的行为,并给我们一个最小的、可编译的测试用例。您当前的测试用例不可编译。

于 2013-04-10T14:44:17.077 回答
1

你定义的方式aname_seen是指向 char 数组的指针

char *aname_seen = malloc(count * (sizeof(char) * 3));

aname_seen[i]一个也是char

所以

printf("%d: %s vs %s\n", i, aname, aname_seen[i]);

应该

printf("%d: %s vs %c\n", i, aname, aname_seen[i]);
于 2013-04-10T14:45:37.273 回答