挣扎于 strcpy 和哈希表

Posted

技术标签:

【中文标题】挣扎于 strcpy 和哈希表【英文标题】:Struggling with strcpy and hash tables 【发布时间】:2021-04-03 18:27:12 【问题描述】:

我有一个关于哈希的分配。我已经完成了我的工作。至少我是这么认为的……无论如何,我的职责是创建一个结构并使用哈希表对其进行索引。我已经完成了所有功能等,但是当我想对我的 struct exe 文件进行一些输入时,会停止工作并完成程序。那么这是什么原因呢?

这是我的代码:


#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct 
    int musteri_no;
    char ad[20], soyad[20];
 Musteri;
Musteri *veri_liste[10];
int hash_tablo[10][2];

//Hash tablosuna istenilen şekilde veri koyan fonksiyon
void put(int musteri_no,Musteri* musteri)
    printf("Calisii");
    while(true)
        if(hash_tablo[musteri_no%10][0]==-1)
            hash_tablo[musteri_no%10][0]=musteri_no;
            veri_liste[musteri_no%10]=musteri;
            printf("Calisii");
        
        else
            for(int i=0;i<10;i++)
                if(hash_tablo[i][1]!=-1)
                    continue;
                    printf("Calisii");
                
                else
                    printf("Calisii");
                    hash_tablo[musteri_no%10][1]=i;
                    hash_tablo[i][0]=musteri_no;
                    
                
            
        
    

void search(int musteri_no)
    int i=1,kontrol=hash_tablo[musteri_no%10][1];
    printf("%d : Aranilan deger",musteri_no);
    while(i<=1)
        if(hash_tablo[musteri_no%10][0] == musteri_no)
            printf("%d %s %s",veri_liste[musteri_no%10]->musteri_no,veri_liste[musteri_no%10]->ad,veri_liste[musteri_no%10]->soyad);
            printf("%d Adimda bulundu",i);
            break;
        
        else
            if(i==1)
                i++;
                if(hash_tablo[kontrol][0]==musteri_no)
                    printf("%d %s %s",veri_liste[kontrol]->musteri_no,veri_liste[kontrol]->ad,veri_liste[kontrol]->soyad);
                    printf("%d Adimda bulundu",i);
                    break;
                
                else
                    kontrol=hash_tablo[kontrol][1];
                
            
            else
                i++;
                if(hash_tablo[kontrol][0]==musteri_no)
                    printf("%d %s %s",veri_liste[kontrol]->musteri_no,veri_liste[kontrol]->ad,veri_liste[kontrol]->soyad);
                    printf("%d Adimda bulundu",i);
                    break;
                
                else
                    kontrol=hash_tablo[kontrol][1];
                
            
        
    

void delete_value(int musteri_no)
    for(int i=0;i<10;i++)
        if(hash_tablo[i][0]==musteri_no)
            hash_tablo[i][0]=-1;
        
        else
            continue;
        
    

void hash_list()
    for(int i=0;i<10;i++)
            printf("%d %d\n",hash_tablo[i][0],hash_tablo[i][1]);
    
                            

void data_list()
    for(int i=0;i<10;i++)
        if(veri_liste[i]==NULL)
            continue;
        
        else
            printf("%d %s %s\n",veri_liste[i]->musteri_no,veri_liste[i]->ad,veri_liste[i]->soyad);
        
    

int main()
    Musteri* gecici_m;
    char isim[20],soyisim[20];
    int musteri_no;
    for(int i=0;i<10;i++)
        for(int j=0;j<2;j++)
            hash_tablo[i][j]=-1;
        
    
    printf("Musteri no giriniz:");
    scanf("%d",&musteri_no);
    printf("İsim giriniz:");
    scanf("%s",&isim);
    printf("Soyisim giriniz:");
    scanf("%s",&soyisim);
    strcpy(gecici_m->ad,isim);
    strcpy(gecici_m->soyad,soyisim);
    gecici_m->musteri_no=musteri_no;
    put(musteri_no,gecici_m);
    printf("Hash list:\n");
    hash_list();
    printf("Data list:\n");
    data_list();`

我会为您提供所有代码,因为我无法弄清楚这里有什么问题。非常感谢。

【问题讨论】:

Musteri* gecici_m; 该指针从未初始化。 我该怎么做?当我尝试这样做时,我收到一个错误,例如:从 'void*' 到 'Musteri*'[-fpermissive] 的无效转换 ---- 而我要分配的行是: Musteri *veri_liste= malloc(10*sizeof (Musteri)) 您试图在那里分配错误的指针。在 C 中尝试 Musteri *gecici_m = malloc(sizeof (Musteri));,或在 C++ 中尝试 Musteri *gecici_m = (Musteri *)malloc(sizeof (Musteri)); 【参考方案1】:

除了使用@dxiv 已经指向的未分配指针之外,您的代码中还有以下错误。

1)

main.c:在函数“put”中: main.c:23:11: error: ‘true’ undeclared (第一次在这个函数中使用) 而(真) ^~~~ main.c:23:11: 注意:每个未声明的标识符只针对它出现的每个函数报告一次 main.c:在函数'main'中: main.c:118:13:警告:格式“%s”需要“char *”类型的参数,但参数 2 的类型为“char (*)[20]”[-Wformat=] scanf("%s",&isim); ^ main.c:120:13:警告:格式“%s”需要“char *”类型的参数,但参数 2 的类型为“char (*)[20]”[-Wformat=] scanf("%s",&soyisim); ^ main.c:128:17: 错误: 流浪'’ in program data_list(); ^

有两个警告抱怨您使用的类型%s 需要类型为“char *”的参数,但参数 2 的类型为“char (*)[20]

您必须按以下方式解决这些问题。

scanf("%s",isim);
scanf("%s",soyisim);

其他的貌似有错别字和隐藏代码,请更正。

您的程序中还有其他问题所在。

    你还需要在使用前为Musteri *veri_liste[10];分配内存,否则你的程序行为是不确定的。

    你的这个函数void put(int musteri_no,Musteri* musteri)while(true)运行,你还没有为它处理任何终止点,否则你的代码将陷入无限循环。

【讨论】:

我还有一个问题……我怎样才能为我的结构数组分配内存? 在 SO 上有很好的例子 1 2,看看它们,如果你还有任何问题,请发布一个新问题。

以上是关于挣扎于 strcpy 和哈希表的主要内容,如果未能解决你的问题,请参考以下文章

哈希表3

哈希表之四查找及分析

Lua的混合数组和哈希表;它存在于其他任何地方吗?

哈希表的静态,动态,以及key/value形式

哈希表查找

哈希表