挣扎于 strcpy 和哈希表
Struggling with strcpy and hash tables
我有一个关于哈希的作业。我已经完成了我的工作。至少我是这么认为的……不管怎样,我的职责是创建一个结构并用散列索引它 table。我已经完成了所有功能等,但是当我想对我的结构 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();`
}
我会为您提供所有代码,因为我无法弄清楚这里有什么问题。非常感谢。
除了使用@dxiv 已指向的未分配指针外,您的代码还存在以下错误。
1)
main.c: In function ‘put’:
main.c:23:11: error: ‘true’ undeclared (first use in this function)
while(true){
^~~~
main.c:23:11: note: each undeclared identifier is reported only once for each function it appears in
main.c: In function ‘main’:
main.c:118:13: warning: format ‘%s’ expects argument of type ‘char * ’, but argument 2 has type ‘char ( * )[20]’ [-Wformat=]
scanf("%s",&isim);
^
main.c:120:13: warning: format ‘%s’ expects argument of type ‘char * ’, but argument 2 has type ‘char ( * )[20]’ [-Wformat=]
scanf("%s",&soyisim);
^
main.c:128:17: error: stray ‘’ 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)
是 运行ning 在 while(true)
中,你没有为它处理任何终止点,否则你的代码将 运行进入无限循环。
我有一个关于哈希的作业。我已经完成了我的工作。至少我是这么认为的……不管怎样,我的职责是创建一个结构并用散列索引它 table。我已经完成了所有功能等,但是当我想对我的结构 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();`
}
我会为您提供所有代码,因为我无法弄清楚这里有什么问题。非常感谢。
除了使用@dxiv 已指向的未分配指针外,您的代码还存在以下错误。
1)
main.c: In function ‘put’:
main.c:23:11: error: ‘true’ undeclared (first use in this function)
while(true){
^~~~ main.c:23:11: note: each undeclared identifier is reported only once for each function it appears in
main.c: In function ‘main’:
main.c:118:13: warning: format ‘%s’ expects argument of type ‘char * ’, but argument 2 has type ‘char ( * )[20]’ [-Wformat=]
scanf("%s",&isim);
^ main.c:120:13: warning: format ‘%s’ expects argument of type ‘char * ’, but argument 2 has type ‘char ( * )[20]’ [-Wformat=]
scanf("%s",&soyisim);
^ main.c:128:17: error: stray ‘’ 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)
是 运行ning 在while(true)
中,你没有为它处理任何终止点,否则你的代码将 运行进入无限循环。