كيفية عكس strtok سلسلة C ++ من الذيل لرئاسة؟

أعتقد أنني بحاجة إلى إصدار عكسي من strtok ، مثل:

char* p = rstrtok(str, delimeters);

على سبيل المثال ، احصل بشكل تسلسلي على الموضع من '-' ، '_' و '+' في السلسلة "hello + stack_over-flow" باستخدام مجموعة محدد من "+ _-"

لا يهمني سوى المحددات ، وموقعها ، (وليس المحتوى بين) ، لذلك أعتقد أن boost :: split_iterator غير مناسب هنا.

هل هناك أي وظيفة فائدة موجودة يمكنني الاستفادة منها؟ أو أي حل للتعامل مع هذا النوع من الموقف؟
وعلاوة على ذلك ، منذ أن أقوم به C ++ ، هل هناك أي نهج مناسب لتجنب هذه الموضة C القديمة؟

(بحثت في "strtok عكس" ولكن مجرد الحصول على "كومة تدفق" لأشياء "تدفق فوق كومة" ...)

6
لا أعتقد أن هناك وظيفة ستقوم بذلك نيابة عنك. أعتقد أنك يجب أن تستخدم حلقة.
وأضاف المؤلف nhahtdh, مصدر

3 إجابة

يمكنك إنشاء حسابك باستخدام strrchr .

إذا كنت تستخدم نمط C ++ std :: string ، فيمكنك الاستفادة من string :: find_last_of </القانون> .

8
وأضاف
شكرا @ ديرك ، سلسلة :: find_last_of جيد ، ولكن لا بد لي من تكرار مجموعة من المحددات في كل مرة ؛ وقارن المسافات لمعرفة من هو الأقرب إلى الذيل.
وأضاف المؤلف Lyn, مصدر
أعتقد أنني يجب أن أدافع عن نفسي ... المثال والإخراج هو "على سبيل المثال ، الحصول بشكل تسلسلي على موضع" - "،" "و" + "في السلسلة" hello + stack_over-flow "باستخدام مقياس مجموعة من "+ -" "؛ أيضا ، أعتقد أننا جميعا نريد أن نفعل الأشياء بطريقة مرهقة وعرضة للخطأ.
وأضاف المؤلف Lyn, مصدر
Lyn: لم يتم تحديد ذلك في سؤالك. هل يمكنك تعديل سؤالك ونشره بالضبط التي تريدها كمخرج (ربما مع بعض الأمثلة)؟
وأضاف المؤلف dirkgently, مصدر
Lyn: الجزء الذي * يجب عليك مقارنة المسافات ... * لم يكن هناك. هذا ليس عن الدفاع. إنه يتعلق بتحسين وقتك ووقت الأشخاص الذين يحاولون مساعدتك. FWIW ، ربما تم إغلاق هذا السؤال لأنك لا تخبرنا بما جربته.
وأضاف المؤلف dirkgently, مصدر

يمكنك القيام بذلك باستخدام strpbrk :

char string[] = "hello+stack_over-flow";

char *pos = string;
while (*pos != '\0' && (pos = strpbrk(pos, "+-_")) != NULL)
{
    /* Do something with `pos` */

    pos++;  /* To skip over the found character */
}
3
وأضاف
شكراjo ، وأعتقد أنني أحب strpbrk ، ولكن هل هناك نسخة عكس ذلك؟ أو سأعكس السلسلة أولاً واستخدامها. سوف أمل تمرير مراجعة التعليمات البرمجية ...
وأضاف المؤلف Lyn, مصدر
Lyn بقدر ما أعرف ، ليس هناك نسخة عكسية منه ، لذلك للأسف لديك لعكس السلسلة أولاً.
وأضاف المؤلف Some programmer dude, مصدر

strtok هي بسيطة جدا في الإصدارات الأساسية - بضع مئات من خطوط على الأكثر. إذا كنت Google "strtok filetype: c" يمكنك أن ترى كيف يتم تنفيذها في المكتبات المختلفة.

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

شيء من هذا القبيل:

void reverse(char* dest, const char* src)
{
    int len = strlen(src);
    int i;
    for(i = 0; i < len; ++i)
        dest[len-i-1] = src[i];
}

تصحيح:

Coincidentally I have this Dr Dobbs page open in a tab from a Google search yesterday: http://www.drdobbs.com/conversations-al-go-rithms/184403801

0
وأضاف