我必须做一个字典模拟器的二进制搜索,现在这是我的功能,我不知道为什么它会崩溃,如果有人可以帮助我我会很高兴..! ^^strcmp与结构2d数组
这是我的结构:
typedef struct
{
char *world;
char *meaning;
} par;
,这里是不起作用的代码。 我要为我的英语和意大利变数的名称感到抱歉,但我是意大利人... ^^ 如果你需要一些建议,请告诉我..! p.s. 我试着评论,因为我可以,再次抱歉..!
#include <stdio.h>
#include <stdlib.h>
#define MAX 40
typedef struct
{
char *Parola;
char *Significato;
} par;
int Ricerca(par Dizionario[MAX][21], char Richiesta[20], int Min, int Max, int Iniziale);
int main()
{
par Dizionario[MAX][21] =
{
{
/////////////////////load my 2d array////////////////////
//seconda riga
{"Accendere", "Trasmettere energia elettrica a un apparecchio o dispositivo per farlo funzionare"},
{"Bellezza","Qualita' di ciò che è bello"},
{"Comune","Che e' di tutti, o che appartiene a piu' persone o cose"},
{NULL, NULL},
{"Elenco", "Nota, registro ordinato"},
{NULL, NULL},
{NULL, NULL},
{NULL, NULL},
{"Impetuoso","Che si muove con impeto [anche in senso figurato]; che si lascia vincere dall'impeto"},
{"Lancio","Atto, effetto del lanciare o del lanciarsi"},
{NULL, NULL},
{NULL, NULL},
{NULL, NULL},
{"Produrre","Presentare, allegare, citare"},
{NULL, NULL},
{NULL, NULL},
{"Saccone","Grosso sacco, imbottito generalmente di paglia, che si mette sotto il materasso o si usa talvolta in sua vece"},
{NULL, NULL},
{NULL, NULL},
{"Verticale","Perpendicolare a un piano orizzontale; che sta ritto con la parte superiore in alto e l'inferiore in basso"},
{NULL, NULL}
}
};
int i, j, flag, Iniziale = 0;
par temp;
char Richiesta[20], Rtemp[20];
/////////////////////bubble sort/////////////////////
for(j=0; j<21;j++)
{
for(i=0; i<MAX && Dizionario[i+1][j].Parola != NULL; i++)
{
if(strcmp(Dizionario[i][j].Parola, Dizionario[i+1][j].Parola) == 1)
{
temp=Dizionario[i][j];
Dizionario[i][j] = Dizionario[i+1][j];
Dizionario[i+1][j] = temp;
}
}
}
//i'm gonna ask to the user what word he want
printf("Che parola vuole cercare?");
gets (Richiesta);
strcpy(Rtemp, Richiesta);
printf("%s", Rtemp);
Rtemp[0] = toupper(Rtemp[0]);
printf("\n%s", Rtemp);
//I'm checking what's the first char, if it's a, i'm gonna assign 0 so it's
//it's gonna to the 'n' column and shifting there
switch(Rtemp[0])
{
case 'A': Iniziale = 0;
break;
case 'B': Iniziale = 1;
break;
case 'C': Iniziale = 2;
break;
case 'D': Iniziale = 3;
break;
case 'E': Iniziale = 4;
break;
case 'F': Iniziale = 5;
break;
case 'G': Iniziale = 6;
break;
case 'H': Iniziale = 7;
break;
case 'I': Iniziale = 8;
break;
case 'L': Iniziale = 9;
break;
case 'M': Iniziale = 10;
break;
case 'N': Iniziale = 11;
break;
case 'O': Iniziale = 12;
break;
case 'P': Iniziale = 13;
break;
case 'Q': Iniziale = 14;
break;
case 'R': Iniziale = 15;
break;
case 'S': Iniziale = 16;
break;
case 'T': Iniziale = 17;
break;
case 'U': Iniziale = 18;
break;
case 'V': Iniziale = 19;
break;
case 'Z': Iniziale = 20;
break;
}
flag = Search(Dizionario, Rtemp, 0, MAX, Iniziale);
printf("%d", flag);
system("PAUSE");
return 0;
}
int Search(par Dictionary[MAX][21], char Request[20], int Min, int Max, int init)
{
int Median;
Median = (Min+Max)/2;
if(strcmp(Request, Dizionario[Median][Init].world) == 0)
return Median;
else if(Max <= Min) // elemento non trovato
{
return -1;
}
else if(strcmp(Request, Dictionary[Median][Init].world)>= 1)
{
return Search(Dictionary, Request, Median+1, Max, Init);
printf("ok");
}else{
return Search(Dictionary, Request, Min, Median-1, Init);
printf("ok");
}
}
@ john3136 如果我要去这样做(Iniziale = RTEMP [0] - 'A'),我可以eaven知道我得走了。 我解释得更好一些,rwason为什么开关是如果我有'A',我知道所有的开始与'A'的世界是在posizion [x] [0] B相同,但[ x] [1]等等......我不知道我是否明白我的意思,让我知道.. ^^ ps 我有问题还做<,或者==>比0至少比1 ..
@Uli科勒 他会崩溃的功能,因为我理解调试,问题是出在了“的strcmp() “呼叫 特地在这里
if(strcmp(Request, Dizionario[Median][Init].world) == 0)
这里
else if(strcmp(Request, Dictionary[Median][Init].world)>= 1)
@cnicutar 增加了对空控制,它的崩溃一样 我已经编辑这样
if(strcmp(Richiesta, Dizionario[Mediano][Iniziale].Parola) == 0 && Dizionario[Mediano][Iniziale].Parola != NULL) // elemento trovato
if(strcmp(Richiesta, Dizionario[Mediano][Iniziale].Parola)> 0 && Dizionario[Mediano][Iniziale].Parola != NULL)
这些都是我的2个控制现在...
@BLUEPIXY 我不能使用bsearch,我都用我自己......
做二进制搜索
请提供关于为何未能如预期 –
'STRCMP运行更多详细资料()'返回<0, 0 or > 0,所以你的== 1检查是非常具体的 - 我怀疑这是不是你真正想要的东西。另外,用'Iniziale = Rtemp [0] - 'A'替换该开关;最后但并非最不重要的请不要用大写字母开头变量名! – John3136
一个问题是,您从不检查以确保'Dictionary [Median] [Init]'不是'NULL'。 – cnicutar