سؤال

لقد قمت بتطوير نسختي الخاصة من strtok.فقط للتدرب على استخدام المؤشرات.

هل يمكن لأي شخص رؤية أي قيود على هذا أو يمكنني تحسينه على أي حال.

void stvstrtok(const char *source, char *dest, const char token) 
{
    /* Search for the token. */
    int i = 0;
    while(*source)
    {
        *dest++ = *source++;
        if(*source == token)
        {
            source++;
        }
    }
    *dest++ = '\0';
    }

int main(void)
{
    char *long_name = "dog,sat ,on ,the,rug,in ,front,of,the,fire";
    char buffer[sizeof(long_name)/sizeof(*long_name)];

    stvstrtok(long_name, buffer, ',');

    printf("buffer: %s\n", buffer);

   getchar();

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

المحلول

ملاحظة جانبية:عادةً ما تُستخدم كلمة "الرمز المميز" لوصف أجزاء السلسلة التي يتم إرجاعها.يستخدم المحدد لوصف الشيء الذي يفصل بين الرموز المميزة.لذا، لجعل التعليمات البرمجية الخاصة بك أكثر وضوحًا، يجب عليك إعادة تسمية الرمز المميز إلى المحدد وإعادة تسمية dest إلى token_dest.

الاختلافات في وظيفتك وstrtok:

هناك العديد من الاختلافات بين وظيفتك وstrtok.

  • ما تفعله وظيفتك هو ببساطة إزالة فواصل الرمز المميز
  • يمكنك استدعاء وظيفتك مرة واحدة فقط لمعالجة جميع أجزاء السلسلة.باستخدام strtok، يمكنك الاتصال به عدة مرات لكل جزء من السلسلة (الأوقات اللاحقة مع NULL كمعلمة أولى).
  • يقوم strtok أيضًا بتدمير السلسلة المصدر، بينما يستخدم الكود الخاص بك المخزن المؤقت الخاص به (أعتقد أنه من الأفضل استخدام المخزن المؤقت الخاص بك كما فعلت).
  • يقوم strtok بتخزين موضع الرمز المميز التالي بعد كل استدعاء حيث تكون المعلمة الأولى فارغة.ثم يتم استخدام هذا الموقف للمكالمات اللاحقة.هذا ليس آمنًا للخيط وستكون وظيفتك آمنة للخيط.
  • يمكن أن يستخدم strtok عدة محددات مختلفة، بينما يستخدم الكود الخاص بك محددًا واحدًا فقط.

ومع ذلك، سأقدم اقتراحات حول كيفية إنشاء وظيفة أفضل، وليس وظيفة أقرب إلى تنفيذ strtok.

كيفية تحسين وظيفتك (وليس محاكاة strtok):

أعتقد أنه سيكون من الأفضل إجراء التغييرات التالية:

  • اجعل وظيفتك تقوم ببساطة بإرجاع الرمز المميز "التالي".
  • اخرج من حلقتك عندما يكون لديك محدد *source أو *source ==
  • قم بإرجاع مؤشر إلى الحرف الأول من السلسلة المصدر التي تحتوي على الرمز المميز التالي.يمكن استخدام هذا المؤشر للمكالمات اللاحقة.

نصائح أخرى

وهذا الرمز لا يعمل على الإطلاق مثل strtok(). ماذا كنت تحاول أن تفعل بالضبط؟ ولكن بقدر ما التحسينات، رمز لديه خلل خطير: إذا كان طول source تطرح من قبل عدد من الحوادث من token أكبر من طول dest كنت قد حصلت على نفسك كلاسيكية جدا <م> المكدس تجاوز ، والذي يبدو السخرية إلى حد ما بالنسبة لي في الوقت الراهن. هذا لن يحدث في main أن كنت قد استخدمت، ولكن باستخدام وظيفة في أي مكان آخر لا بد أن تقودك إلى طريق عدم اليقين ومستنقع اليأس.

وstrtok يسمح لك لتكرار خلال كل الرموز. وذلك من خلال افتراض أن سلسلة مصدر قابل للكتابة وإدراج القيم الخالية في ذلك في فواصل رمزية. المخزن المؤقت الوجهة هو مؤشر إلى الحرف تعويض WITHING المخزن المؤقت المصدر. يمكنك استخدام هذه الحقيقة لمعرفة متى كنت قد وصلت إلى نهاية + أيضا الحفاظ على "الدولة" بين المكالمات.

وStrtok ليس وظيفة جيدة لاستخدام، لأنه يدمر سلسلة المصدر. كما لا إعادة الوافد ذلك.

وstrtok () سيوفر بعض الدول، لذلك يمكن أن يطلق عليه عدة مرات للحصول على الرموز متعددة. أيضا، strtok () سوف "تقسيم" سلسلة المصدر بحيث تحصل سلاسل جهة متعددة، كل واحد كونه رمز.

جميع أكواد لا، من ما أرى، هو تجاهل أي حرف الإدخال الذي يساوي المفرق رمزية، ومواصلة النسخ على خالية إنهاء المصدر.

وتحرير: بالإضافة إلى ذلك، والنظر هناك نوعان من التسلسل رمز-seperators: سيتم تجاهل أول مرة من قبل وظيفة الخاص بك، وسوف يتم كتابة الثانية إلى الوجهة، في حين strtok () وتحديد seqeunce من 2 أو أكثر من المحددات باعتبارها واحدة محدد (الصفحة الرجل: http://man.cx/؟page=strtok )

وstrtok يدمر سلسلة الإدخال مع الطابع NUL، الأمر الذي يجعل من نوع من العدائية.

وعليك أن تنظر أيضا حالة "س ع ص ،، بدق" كم عدد الرموز وstrtok الانسحاب من هذه السلسلة إذا '،' غير محدد.

وماذا تريد وظيفة لتفعل في هذه الحالة؟

وأيضا، strtok (...) يدعم الأحرف المحدد متعددة. النظر في تعريفات strspn (...) وstrcspn (...)، لأنها يمكن أن تستخدم لإعادة تنفيذ-strtok (...).

وبالمناسبة، long_name هو مؤشر إلى شار وsizeof (long_name) وsizeof (تشار *). ليس حجم ما النقاط long_name ل.

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