لماذا تعطل المكالمة إلى BSearch () البرنامج المقدم؟

StackOverflow https://stackoverflow.com/questions/1813617

  •  06-07-2019
  •  | 
  •  

سؤال

لدي ملف قاموس غير مصنّف باسم "dict.txt". لقد تمكنت من وضع كلمات الملف في صفيف ويبدو أن QSort () أستخدمه أيضًا يعمل بشكل جيد (أي ، يتم فرز الصفيف).

تنشأ المشكلة عندما أتصل بـ BSearch () ، ويتعطل البرنامج وسؤالي هو:

لماذا يحدث هذا؟

أستخدم GCC لتجميع وعدم استخدام IDE من أي نوع ، لذلك ليس لدي أي تصحيح أو لا أعرف كيفية استخدام واحدة (حتى الآن).

أنا أدرك تمامًا أن الرمز المقدم هنا قد يحتوي على العديد من المشكلات.

ذلك لأنني جديد تمامًا على C وخلفيتي هي بشكل أساسي Java (والتي على الرغم من أوجه التشابه يبدو أنها عيب ، لأنني معتاد على OO و C من الواضح أنها ليست OO).

أي نصيحة سيكون موضع تقدير كبير.

int strcmp_mod(const void *p1, const void *p2) {
   return strcmp(* (char * const *) p1, * (char * const *) p2);
}

int main(void) {

int size, i;
char **words;

char *pItem;
char *key = "fight";

char* buf = load_file("dict.txt"); if (buf == NULL) return 1;

size = count_words(buf);

words = (char**)malloc((size+1) * sizeof(char*));

for (i=0; i<size; i++) {
    words[i] = (char*)malloc(80 * sizeof(char));
}   

copy_words_to_lower(buf, words, size);
    words[size] = '\0';

    qsort(words, size, sizeof(char*), strcmp_mod);

for (i=0; i<size; i++) {
    printf("%s\n", words[i]);
}  

pItem = (char *) bsearch(key, words, size, sizeof(char*), strcmp_mod);

if (pItem!=NULL)
    printf ("%s is in the array.\n", pItem);
else
    printf ("%s is not in the array.\n", key); 

return 0;
}
هل كانت مفيدة؟

المحلول

حاول العطاء bsearch ال تبوك من key.

نصائح أخرى

لماذا يحدث هذا؟

أنت تمر A. char* كما key المعلمة إلى BSearch ، ولكن المقارن الخاص بك يتوقع نتيجة إلقاء أ char** إلى باطلة*.

بمجرد إصلاح ذلك ، فإن المشكلة التالية هي أن قيمة الإرجاع من BSearch هي مؤشر إلى العنصر المطابق في الصفيف. لذلك مرة أخرى أ char** ليس أ char*.

أي نصيحة سيكون موضع تقدير كبير.

إما الحصول على تصحيح الأخطاء ، أو الاستعداد لإضافة الكثير من التسجيل إلى التعليمات البرمجية الخاصة بك.

أيضا بناء الخاص بك words صفيف بعيدا قليلا. نظرًا لأنه يتم إنجاز المهمة ، ولكن قد يكون ذلك فكرة تخصيص المخزن المؤقت لكل كلمة كما تذهب ، بدلاً من نفس الحجم في البداية. من يدري ما إذا كان شخص ما سوف يرسل لك ملفًا بكلمة أكثر من 80 شاحنًا؟ تقوم بإنهاء قائمة الكلمات مع nul حرف, ، " 0" ، عندما تقصد أنه من قبل إنهاءها فارغًا مؤشر, ، لا شيء. " 0" يعمل بالفعل ، لأنها طريقة أخرى لقول 0 ، و 0 يتحول إلى مؤشر فارغ. لكن هذا ليس ما تعنيه. ولا تحتاج المصفوفة إلى إنهاء الفرق على الإطلاق الآن ، لأنه في كل مرة تستخدمها بعد ذلك تحدد طولها ، size.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top