我需要在C中创建一个带有结构和链表的电话簿。
数据将存储在文件中。我会存储像
这样的数据Name1#Surname1#Date1#Number1
Name2#Surname2#Date1#Number2
Name3#Surname3#Date1#Number3
但是,我无法通过分隔符"#"并在我的结构中使用数据。这是我的代码:
#include <stdio.h>
#include <locale.h>
//Veri Yapısı:
typedef struct kisi
{
char isim[50];
char soyisim[50];
int dYili;
char telefon[16];
struct kisi *sonraki;
}Kisi;
int main()
{
//Türkçe çıktılarda sorun yaşamamak için:
setlocale(LC_ALL,"Turkish");
//Dosya yolunu sabitle:
char *dosyaYolu = "rehber.dat";
//Dosyayı aç:
FILE *dosya;
//Okuma modunda
dosya = fopen(dosyaYolu,"r");
//Eğer dosya açılmazsa:
if(dosya == NULL)
{
printf("Dosya açılamadı. Yolu doğru girdiğinizden emin olun.\n===============================\n\n");
main();
}
//Dosya açıldı.
else
{
Kisi *liste = (Kisi*)malloc(sizeof(Kisi));
Kisi *iter = liste;
//Dosyanın sonuna kadar oku:
while(!feof(dosya))
{
char *veri;
fscanf(dosya,"%s",veri);
char *tok = strtok(veri, "#");
int sayac = 0;
while(tok != NULL)
{
switch(sayac)
{
case 0: strcpy(iter->isim,tok);
break;
case 1: strcpy(iter->soyisim,tok);
break;
case 2: iter->dYili = (int)tok;
break;
case 3: strcpy(iter->telefon,tok);
break;
}
sayac++;
tok = strtok(NULL, "#");
}
iter->sonraki = (Kisi*)malloc(sizeof(Kisi));
iter = iter->sonraki;
}//while sonu
//Dosyayla işimiz bitti. Kapat:
fclose(dosya);
}
system("pause>null");
}
我需要做的是:
我的问题是,当我运行此程序时,它会停止工作。当我用switch-case删除while循环时,只需printf我的令牌,它就可以了。
其他信息:
答案 0 :(得分:0)
您有2个重要问题导致未定义的行为,从而导致程序出现问题
您未在外veri
循环中为while
分配空间
char *veri;
fscanf(dosya,"%s",veri);
你应该至少做一些像
这样的事情char veri[100];
fscanf(dosya,"%99s",veri);
您可以将指针的值指定给int
iter->dYili = (int)tok
你应该通过这种方式int
将字符串转换为strtol
iter->dYili = strtol(tok, NULL, 10);
如果你想在循环的开头检查转换错误delcare char *endptr;
并执行此操作
iter->dYili = strtol(tok, &endptr 10);
if (*endptr != '\0')
anErrorOccurredHandleIt();
此外,请不要忘记free
所有malloc
指针,我认为fgets
会在这种情况下做得更好。