سؤال
تجميع مع دول مجلس التعاون الخليجي C99
أنا أحاول أن أقارن 2 سلسلة باستخدام سلسلة مقارنة.ومع ذلك, لا يبدو أن يكون الحصول على تفريغ المكدس على strcmp خط.
**السمة سوف تحتوي على هذه ، لذلك أنا أبحث عن frametype.
[name] [time] [type] [time]
[name] [callref] [type] [string]
[name] [port] [type] [int16]
[name] [frametype] [type] [int16]
هل هذه الطريقة الصحيحة مقارنة.
شكرا جزيلا على أي اقتراحات ،
void g_start_element(void *data, const char *element, const char **attribute)
{
for(i = 0; attribute[i]; i++)
{
/* Only interested in the frametype */
if(strcmp(attribute[i], "frametype") == 0)
{
/* do some work here */
}
}
}
المحلول
والسياق من هذا الرمز هو إعراب المغتربين - انظر في هذا المنصب أ >. مجموعة سمات وبالتناوب اسم وقيمة، مع واحد 0 لإنهاء.
وإلا إذا كنت تبحث عن أي سمة الذي يساوي سلسلة الاختبار (والتي ستكون غير عادية إلى حد ما) اسم أو قيمة، ثم الشفرة يجب فسيزيد ط بنسبة 2 بدلا من 1 - بحيث الخطوات على كل من اسم و قيمة.
ويجب أن تكون مقارنة إما السمة [أنا] لمطابقة الاسم، أو السمة أو [ط + 1] لتتناسب مع القيمة.
ولا تفترض أن السمات ستكون في أي ترتيب معين. حاليا كنت تبحث فقط في سمة 1 ، الذي هو القيمة السمة الأولى التي تم إرجاعها. إذا كان هناك أكثر من سمة واحدة، فإنها يمكن إعادتها في أي أمر.
نصائح أخرى
وأنت بحاجة إلى سلسلة فارغة من أجل إنهاء للحلقة:
[name] [time] [type] [time]
[name] [callref] [type] [string]
[name] [port] [type] [int16]
[name] [frametype] [type] [int16]
null
وبدون أن هذه الحلقة for لا تنتهي وسوف ينتهي بك الأمر مع السمة [أنا] لافتا إلى القمامة عند استدعاء strcmp.
- كيف هو السمة مجموعة تهيئة?NULL عنصر قد تراجع في.
- أيضا عنصر صفيف يجب أن ينتهي مع فارغة.
- قد تفكر في استخدام strncmp() كبديل أكثر أمانا strcmp().
هل إدخال مجموعة الخاص بك (attribute
) منتهية NULL؟ كنت لا نورد على أنها الحاضر، ولكن يتطلب رمز على خلاف ذلك سيكون مجرد المشي جنبا إلى جنب في الذاكرة العشوائية، وهو سبب وجيه لخطأ التقسيم.
وأدخل الطباعة للمؤشر و / أو السمة يجري مقارنة لمعرفة ما اذا كان يتصرف بالطريقة التي تتوقعها فيما يتعلق بإنهاء.
وليس على يقين من ذلك حول الجزء سلسلة مقارنة السؤال ... إذا كان الإدخال على تلك الأقواس المربعة وهلم جرا، فإنك لن تجد أي شيء من أي وقت مضى منذ كنت تبحث في بداية كل سلسلة. محاولة strstr()
إذا كان هذا هو الحال، فإنه يجد فرعية.
واضافة قطع الأشجار وتفريغ كل الصفات والقيمة مفهرس على طول الطريق. وهذا سوف يساعد تحديد ما يحدث الخطأ.
وراء عدم منتهية، لماذا لا تستخدم strncmp ()؟ :)
وأود أن أضيف الاختيار NULL بحيث يكون لديك
if(attribute[1] != NULL && strcmp("frametype", attribute[1]) == 0)
وحتى لا يتم dereferencing مؤشر NULL.