C拆分字符串并将其用于Struct

时间:2015-01-06 21:41:34

标签: c struct linked-list

我需要在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");
}

我需要做的是:

  1. 从文件中读取数据
  2. 使用struct
  3. 的数据
  4. 链接结构
  5. 添加新人,删除某个人等(我还没有尝试过这些,我的代码中没有任何相关内容)
  6. 我的问题是,当我运行此程序时,它会停止工作。当我用switch-case删除while循环时,只需printf我的令牌,它就可以了。

    其他信息:

    • 我使用文件来存储我的数据
    • 我使用结构和链接列表
    • 每个人都必须在自己的结构中(1个结构= 1个人,当然结构相同)
    • 此程序不能包含C ++代码。

1 个答案:

答案 0 :(得分:0)

您有2个重要问题导致未定义的行为,从而导致程序出现问题

  1. 您未在外veri循环中为while分配空间

    char *veri;
    fscanf(dosya,"%s",veri);
    

    你应该至少做一些像

    这样的事情
    char veri[100];
    fscanf(dosya,"%99s",veri);
    
  2. 您可以将指针的值指定给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();
    
  3. 此外,请不要忘记free所有malloc指针,我认为fgets会在这种情况下做得更好。