C 拆分字符串并将其用于结构
C Split String and Use It For Struct
我需要用 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 循环并只打印我的令牌时,它起作用了。
补充信息:
- 我必须使用文件来存储我的数据
- 我必须使用结构和链表
- 每个人都必须在自己的结构中(1个结构=1个人,当然是同一个结构)
- 此程序不能包含 C++ 代码。
您有 2 个重要问题导致未定义的行为,从而导致您的程序出现问题
您没有在外部 while
循环中为 veri
分配 space
char *veri;
fscanf(dosya,"%s",veri);
你至少应该做一些像
char veri[100];
fscanf(dosya,"%99s",veri);
你将一个指针的值赋给了一个int
iter->dYili = (int)tok
你应该通过 strtol
这种方式将字符串转换为 int
iter->dYili = strtol(tok, NULL, 10);
如果你想检查转换错误 delcare a char *endptr;
在循环的开始并执行此操作
iter->dYili = strtol(tok, &endptr 10);
if (*endptr != '[=14=]')
anErrorOccurredHandleIt();
此外,不要忘记 free
所有 malloc
ed 指针,我认为 fgets
在这种情况下会做得更好。
我需要用 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 循环并只打印我的令牌时,它起作用了。
补充信息:
- 我必须使用文件来存储我的数据
- 我必须使用结构和链表
- 每个人都必须在自己的结构中(1个结构=1个人,当然是同一个结构)
- 此程序不能包含 C++ 代码。
您有 2 个重要问题导致未定义的行为,从而导致您的程序出现问题
您没有在外部
while
循环中为veri
分配 spacechar *veri; fscanf(dosya,"%s",veri);
你至少应该做一些像
char veri[100]; fscanf(dosya,"%99s",veri);
你将一个指针的值赋给了一个
int
iter->dYili = (int)tok
你应该通过
strtol
这种方式将字符串转换为int
iter->dYili = strtol(tok, NULL, 10);
如果你想检查转换错误 delcare a
char *endptr;
在循环的开始并执行此操作iter->dYili = strtol(tok, &endptr 10); if (*endptr != '[=14=]') anErrorOccurredHandleIt();
此外,不要忘记 free
所有 malloc
ed 指针,我认为 fgets
在这种情况下会做得更好。