Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 代码正在添加额外的字符_C_Arrays_File_Struct - Fatal编程技术网

C 代码正在添加额外的字符

C 代码正在添加额外的字符,c,arrays,file,struct,C,Arrays,File,Struct,我有一个函数,它应该读取一个文件,将单独的行作为单独的元素放入一个数组中。然后它应该遍历数组并将某些元素放在结构中的某些位置 我几乎有了它。。。当我去打印结构以确保一切正常时,额外的字符就会出现 这是文件中的内容: 123 pre 45 cse 67 345 ret 45 cse 56 这就是它正在打印的内容: 123 pre 45 cse C 67 345 ret 45 cse 8 56 代码如下: #include <stdio.h> #include <string.

我有一个函数,它应该读取一个文件,将单独的行作为单独的元素放入一个数组中。然后它应该遍历数组并将某些元素放在结构中的某些位置

我几乎有了它。。。当我去打印结构以确保一切正常时,额外的字符就会出现

这是文件中的内容:

123
pre
45
cse
67
345
ret
45
cse
56
这就是它正在打印的内容:

123
pre
45
cse
C
67
345
ret
45
cse
8
56
代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct students         //Defining structure for students
{
    int id;        //Students ID Number
    char name[30];      //Students Name
    int age;            //Students Age
    char dept[4];       //Studets Department
    int grade;          //Students Grade
};



int main()
{
    struct students list[20];
    FILE *f;
    char line[30];
    char **temp = NULL;
    int num_righ = 0;
    int id5;
    int age5;
    int grade5;
    int i, k;

    f = fopen("records.txt", "r");



    while(fgets(line, sizeof (line), f) != NULL)
    {
        if (line != NULL)
        {
            num_righ++;
            temp = (char**)realloc(temp, sizeof(char*) *num_righ);
            temp[num_righ - 1] = strdup(line);
        }
    }

    fclose(f);
    k = 0;
    i = 0;
    while (temp[i] != NULL)
    {
        id5 = atoi(temp[i]);
        list[k].id = id5;
        i++;
        strcpy(list[k].name, temp[i]);
        i++;
        age5 = atoi(temp[i]);
        list[k].age = age5;
        i++;
        strcpy(list[k].dept, temp[i]);
        i++;
        grade5 = atoi(temp[i]);
        list[k].grade = grade5;
        i++;
        k++;


    }
    for (i = 0; i < k; i++)
    {
        printf("%d\n", list[i].id);
        printf("%s", list[i].name);
        printf("%d\n", list[i].age);
        printf("%s\n", list[i].dept);
        printf("%d\n", list[i].grade);
    }
}
#包括
#包括
#包括
结构学生//为学生定义结构
{
int id;//学生id号
char name[30];//学生姓名
int年龄;//学生年龄
char dept[4];//Studets Department
int grade;//学生成绩
};
int main()
{
struct学生名单[20];
文件*f;
字符行[30];
字符**temp=NULL;
int num_righ=0;
INTID5;
国际5岁;
国际五年级;
int i,k;
f=fopen(“records.txt”,“r”);
while(fgets(line,sizeof(line),f)!=NULL)
{
如果(行!=NULL)
{
num_righ++;
temp=(char**)realloc(temp,sizeof(char*)*num_righ);
温度[num_righ-1]=标准值(行);
}
}
fclose(f);
k=0;
i=0;
while(temp[i]!=NULL)
{
id5=atoi(温度[i]);
列表[k].id=id5;
i++;
strcpy(列表[k]。名称,临时[i]);
i++;
年龄5=原子(温度[i]);
列表[k]。年龄=5岁;
i++;
strcpy(列表[k]。部门,临时[i]);
i++;
5级=atoi(温度[i]);
列表[k]。等级=五级;
i++;
k++;
}
对于(i=0;i
以下代码解决了多个问题-它不仅确保字符串被“安全”复制(使用
strncpy
,并用
'\0'
终止字符串),而且还确保您不会创建内存中所有数据的第二个副本(玩具示例没有问题,但为什么要从坏习惯开始)

#包括
#包括
#包括
结构学生//为学生定义结构
{
int id;//学生id号
char name[30];//学生姓名
int年龄;//学生年龄
char dept[4];//Studets Department
int grade;//学生成绩
};
int main()
{
struct学生名单[20];
文件*f;
字符行[30];
字符**temp=NULL;
int num_righ=0;
INTID5;
国际5岁;
国际五年级;
int i,k=0;
字符*换行符;
f=fopen(“records.txt”,“r”);
int s=0;//这是“状态”计数器-从0到4,然后返回到0
while(fgets(line,sizeof(line),f)!=NULL)
{
换行符=strchr(第“\n”行);
if(换行符)*换行符='\0';//终止换行符上的字符串。
开关{
案例0:
列表[k].id=atoi(行);
打破
案例1:
strncpy(列表[k]。名称,行,30);
列表[k]。名称[29]='\0';//确保已终止该列表
打破
案例2:
列表[k]。年龄=atoi(行);
打破
案例3:
strncpy(列表[k]。部门,行,3);
列表[k]。部门[3]='\0';//确保已终止
打破
案例4:
列表[k]。等级=atoi(行);
打破
}
s++;
如果(s==5){
s=0;
k++;//如果是5,返回到0并开始读取下一个结构
}
}
fclose(f);
对于(i=0;i
以下代码解决了多个问题-它不仅确保字符串被“安全”复制(使用
strncpy
,并用
'\0'
终止字符串),而且还确保您不会创建内存中所有数据的第二个副本(玩具示例没有问题,但为什么要从坏习惯开始)

#包括
#包括
#包括
结构学生//为学生定义结构
{
int id;//学生id号
char name[30];//学生姓名
int年龄;//学生年龄
char dept[4];//Studets Department
int grade;//学生成绩
};
int main()
{
struct学生名单[20];
文件*f;
字符行[30];
字符**temp=NULL;
int num_righ=0;
INTID5;
国际5岁;
国际五年级;
int i,k=0;
字符*换行符;
f=fopen(“records.txt”,“r”);
int s=0;//这是“状态”计数器-从0到4,然后返回到0
while(fgets(line,sizeof(line),f)!=NULL)
{
换行符=strchr(第“\n”行);
if(换行符)*换行符='\0';//终止换行符上的字符串。
开关{
案例0:
列表[k].id=atoi(行);
打破
案例1:
strncpy(列表[k]。名称,行,30);
列表[k]。名称[29]='\0';//确保已终止该列表
打破
案例2:
列表[k]。年龄=atoi(行);
打破
案例3:
strncpy(列表[k]。部门,行,3);
列表[k]。部门[3]='\0';//确保已终止
打破
案例4:
列表[k]。等级=atoi(行);
打破
}
s++;
如果(s==5){
s=0;
k++;//如果是5,返回到0并开始读取下一个结构
}
}
fclose(f);
对于(i=0;i#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct students         //Defining structure for students
{
    int id;        //Students ID Number
    char name[30];      //Students Name
    int age;            //Students Age
    char dept[4];       //Studets Department
    int grade;          //Students Grade
};

int main()
{
    struct students list[20];
    FILE *f;
    char line[30];
    char **temp = NULL;
    int num_righ = 0;
    int id5;
    int age5;
    int grade5;
    int i, k=0;
    char *newLine;

    f = fopen("records.txt", "r");
    int s = 0;  // this is the "state" counter - it goes from 0 to 4, then back to 0

    while(fgets(line, sizeof (line), f) != NULL)
    {
       newLine = strchr(line, '\n');
       if(newLine) *newLine='\0'; // terminate string on the newline.
        switch(s) {
          case 0:
            list[k].id = atoi(line);
            break;
          case 1:
             strncpy(list[k].name, line, 30);
             list[k].name[29]='\0'; // make sure it is terminated
             break;
          case 2:
            list[k].age = atoi(line);
            break;
          case 3:
            strncpy(list[k].dept, line, 3);
            list[k].dept[3] = '\0'; // make sure it is terminated
            break;
          case 4:
            list[k].grade = atoi(line);
            break;
        }
        s++;
        if (s == 5) {
          s = 0;
          k++; // if it's 5, go back to zero and start reading next structure
        }
      }
    fclose(f);

    for (i = 0; i < k; i++)
    {
        printf("id: %d\n", list[i].id);
        printf("name: %s", list[i].name);
        printf("age: %d\n", list[i].age);
        printf("dept: %s\n", list[i].dept);
        printf("grade: %d\n\n", list[i].grade);
    }
}