从我上一篇文章中我逐块处理我的代码,以确保它全部正常工作,并且有一些非常奇怪的事情发生。
如果你看一下我的代码,当谈到用唯一的学生ID初始化结构时,它会很乐意在每个人在for循环中初始化之后打印它们(这表明它显然已经完成了它)但是, ,当我想在另一个for循环中的for循环之外再次打印它们作为“仔细检查”时,它出现了可怕的错误,可能是它们根本不在那里?
如果你将代码遍历到底部,你会看到我的评论。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define ROWS 80
#define SIZE 100
#define STUDENTS 20
int string_compare(void const *x, void const *y)
{
return strcmp(*(char**)x, *(char**)y);
}
struct student
{
char student_ID[SIZE];
};
int main(void)
{
FILE* input;
int i,j,data_items;
int records=0;
char buffer_IDs[ROWS][SIZE];
char buffer_subjects[ROWS][SIZE];
int marks[ROWS];
char *string_ptrs[ROWS];
struct student db[STUDENTS];
if((input=fopen("C:\\marks\\marks.txt", "r"))==NULL)
perror("File open failed!");
else
{
while ( ( data_items=fscanf(input, "%s %s %d", buffer_IDs[records], buffer_subjects[records], &marks[records])) == 3) {
printf("%s %s %d\n", buffer_IDs[records], buffer_subjects[records], marks[records]);
string_ptrs[records]=buffer_IDs[records];
records++;
if ( records > ROWS) {
break;
}
}
}
qsort(string_ptrs, records, sizeof(char*), string_compare);
for(i=0;i<records;i=i+4)
{
j=0;
strcpy(db[j].student_ID,string_ptrs[i]);
printf("%s\n",db[j].student_ID); /*Happily prints the unique IDs contained in the structure*/
j++;
}
for(i=0;i<STUDENTS;i++)
printf("%s\n",db[i].student_ID); /*Does NOT print them outside the for loop which initialises the structure. */
return 0;
}
答案 0 :(得分:8)
看起来你的第一个for循环总是只打印第一个学生ID。在循环开始时,将j设置为0,最后将其递增。但是,在循环的每个步骤之后,j再次变为0。
因此,只有第一个学生ID被“初始化”,而下一个元素都是未初始化的。
答案 1 :(得分:1)
为什么你的&#34;初始化&#34;循环在每次迭代时跳过4个字符串指针
for(i=0;i<records;i=i+4)
...
此循环将仅初始化records / 4
数组中的db
个元素。即j
的最终值将告诉您db
中有多少元素具有有意义的student_ID
值。 (而且只有1
,因为正如Alef在他的回答中所指出的那样,你在'#34;初始化&#34;周期'的每次迭代中重置j
的值。
稍后您打印STUDENTS
个元素。 STUDENTS
j
的最终值与STUDENTS
无关。如果j
大于db
,该怎么办?预计,您将从{{1}}的未初始化元素中打印完整的垃圾。