C 将值从数组分配到结构数组

C 将值从数组分配到结构数组,c,arrays,struct,C,Arrays,Struct,我试图将包含所有字符串的数组中的值赋给结构数组,其中一些结构成员是整数。不过,我尝试的方式会导致一些未定义的行为。与下面的代码类似,生成以下内容: 0 surname ▒▒ 1 forename & 2 id 0 应该说什么时候 0 surname Boatswain 1 forename Michael Jr 2 id 109993267 但我不确定我分配这些值的方式有什么问题 代码: 提前感谢您的帮助 编辑:这样更改for循环有什么问题 for(i=0;i<total_li

我试图将包含所有字符串的数组中的值赋给结构数组,其中一些结构成员是整数。不过,我尝试的方式会导致一些未定义的行为。与下面的代码类似,生成以下内容:

0 surname ▒▒
1 forename &
2 id 0
应该说什么时候

0 surname Boatswain
1 forename Michael Jr
2 id 109993267
但我不确定我分配这些值的方式有什么问题

代码:

提前感谢您的帮助

编辑:这样更改for循环有什么问题

for(i=0;i<total_line;i++) { 
  record[i].term=atoi(b[(7*i)]);
  record[i].id=atoi(b[(7*i)+1]);
  strcpy(record[i].surname, b[(7*i)+2]);
  strcpy(record[i].forename, b[(7*i)+3]);
  strcpy(record[i].subject, b[(7*i)+4]);
  record[i].catnum=atoi(b[(7*i)+5]);
  strcpy(record[i].section, b[(7*i)+6]);
}

for(i=0;i在你的
for(j=0;j++;j中,作为预备,这一行(显然你已经发现可疑)

…在从文件读取的字节后添加一个字符串终止符,因此整个过程可以安全地解释为一个大的C字符串

@DavetheSax对您的令牌的索引进行了有效的观察。该问题不会导致未定义的行为,但所产生的行为肯定不是您想要的

然而,您的程序中确实存在未定义的行为。您通过将
内容复制到
ds
中,然后用
strtok()标记
ds
来填充数组
b
。这本身是可以的,但只有当您需要将
内容保留为最初读取的内容时才有必要,您可能不需要这样做。但是,在标记化之后,您可以释放
ds
。这本身也不是问题,但它会使您刚才计算的所有标记指针无效,因为它们指向内存中的是预先设置的为
ds
(它们是从中被标记的)。您需要保留这一点,直到您完成对标记的分析。释放标记指针指向的空间后取消对这些标记指针的引用会产生UB


原则上,我们无法预测UB(否则就不是UB)。尽管如此,您报告的特定结果似乎是不太可能的表现,因此这里可能还有更多的情况发生。

编程的一个关键思想:抽象。这意味着在简单的描述性名称后面隐藏复杂的内容。the(main)因此,C中的工具就是函数。尝试将问题分解为更小的子问题。
无符号字符文件名;
表示一个字符。然后编写
scanf(“%s”,&filename)
读取许多字符。这会导致缓冲区溢出,造成不可预测的后果。感谢您的帮助!我不明白为什么这个循环不起作用。0-6应该转到记录[0],所以7*I=0,j从0-6加上,给记录[0]0-6,等等,记录[1]得到7-13,记录[2]得到14-20。至少,这是我想的。我也不明白你推荐的语法。注释掉j循环并将b[n]'s改为b[n++](比如
record[I]。term=atoi(b[n++]);
)不工作。在这种情况下,我要做的是开始在屏幕上显示调试内容。例如,对循环中的每个语句执行类似操作:
record[I]。term=atoi(b[n]);printf(“记录[I=%d]中存储的整数值%d]。term\n”,atoi(b[n]),I)
这应该可以清楚地说明发生了什么。哦,嘘,嘘。现在我看到了,我觉得自己很傻。再次感谢你的帮助!我现在试着这样做,但仍然不起作用……
(i=0;i++;我谢谢你!关于
内容
ds
,这些都是非常好的观点。我在stackoverflow的其他地方找到了代码,我想我没有很好地为我的程序修改它。我应该如何处理索引呢?我不完全确定当前的问题是什么them@Chylomicron,在您的内部循环,您分配
b[n]
中的每个字段,中间不更新
n
。您修改的非嵌套循环看起来更好。它看起来更好,但由于某些原因仍然不起作用:x和某些原因,print语句不起作用,使调试变得困难。如果有帮助,我将使用gcc编译器。
1301,107515018,"Boatswain","Michael R.",CSE, 230,="R01"
1301,109993269,"Castille","Michael Jr",CSE, 230,="R03"
1301,109993267,"Castille","Janice",CSE, 230,="R03"
for(i=0;i<total_line;i++) { 
  record[i].term=atoi(b[(7*i)]);
  record[i].id=atoi(b[(7*i)+1]);
  strcpy(record[i].surname, b[(7*i)+2]);
  strcpy(record[i].forename, b[(7*i)+3]);
  strcpy(record[i].subject, b[(7*i)+4]);
  record[i].catnum=atoi(b[(7*i)+5]);
  strcpy(record[i].section, b[(7*i)+6]);
}
  contents[size]=0;  // what does all this do exactly?