当害怕构造时,c 中的错误输出

when fread to struct, wrong output in c

实际上代码是土耳其语,但我翻译了一些词,也许对您有所帮助。

结构:

    typedef struct
{
char name[100];
char surname[100];
char idNo[11];
char tel[11];
char address[200];
char email[100];
}personel;

代码:

void personelListele(){

FILE *pdosya;

personel personelBilgi;

pdosya = fopen("personel.txt","rb");
if(pdosya==NULL){
    printf("personel.txt dosyası açılamadı");
    exit(1);
}

int c;

while(c!=0)
{
    c = fread(&personelBilgi,sizeof(personel),1,pdosya);

    if(c!=0){

        printf("Name= %s\n",personelBilgi.name);
        printf("Surname= %s\n",personelBilgi.surname);
        printf("id = %s\n",personelBilgi.idNo);
        printf("Tel = %s\n",personelBilgi.tel);
        printf("Address = %s\n",personelBilgi.addres);
        printf("Email = %s\n",personelBilgi.email);


        }
    }
}

输入:

Name:Guven

Surname:Yildiz

id No:12312312312

Tel No:98798798798

Email:mail@mail.com

Address:somewhere

输出:

Name = Guven
Surname = Yildiz
id No = 1231231231298798798798mail@mail.com
Tel No = 98798798798mail@mail.com
Email = mail@mail.com
Address = somewhere

idNo 输出混合了 idno、telno 和 mail。 telno 也是如此。我不知道为什么会这样。我试过换地方,但没用。

感谢您的帮助。

鉴于此输入:

id No:12312312312

是11个字符,你溢出了

char idNo[11];

因为您不允许 space 作为终止 '[=12=]' 字符添加到字符串。

在这种情况下,您可以判断发生了溢出,因为您在非空终止的字符数组上将变量打印为 c 字符串。在这种情况下,行为是未定义的,但由于您已将数据读入 struct,因此 printf 调用会一直在内存中读取,直到它找到 '[=12=]' 恰好在结构的下一个字符数组。因此,可识别的数字。