نصائح حول كيفية قراءة "الكلمة" الأخيرة في صفيف الأحرف في ج

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

  •  25-09-2019
  •  | 
  •  

سؤال

فقط أتطلع إلى الإشارة في الاتجاه الصحيح:

لديك مدخلات قياسية لبرنامج C ، لقد اتخذت كل سطر في وقت واحد وتخزين في char [].

الآن بعد أن أصبح لديّ char [] ، كيف يمكنني أخذ الكلمة الأخيرة (فقط أفترض مفصولة بمساحة) ثم تحويلها إلى أحرف صغيرة؟

لقد جربت هذا ولكنه يعلق البرنامج فقط:

while (sscanf(line, "%s", word) == 1)
    printf("%s\n", word);

أخذ ما تم اقتراحه وتوصل إلى هذا ، هل هناك طريقة أكثر كفاءة للقيام بذلك؟

char* last = strrchr(line, ' ')+1;

while (*last != '\0'){   
    *last = tolower(*last);
    putchar((int)*last);
    last++;
}
هل كانت مفيدة؟

المحلول

إذا اضطررت إلى القيام بذلك ، فربما أبدأ strrchr. يجب أن تحصل على بداية الكلمة الأخيرة. من هناك ، إنها مسألة بسيطة تتمثل في السير عبر الشخصيات والتحويل إلى حالة أدنى. أوه ، هناك التفاصيل البسيطة التي يتعين عليك حذف أي شخصيات فضاء زائدة أولاً.

نصائح أخرى

المشكلة في الكود الخاص بك هي أنه سيقرأ مرارًا وتكرارًا الكلمة الأولى من الجملة كلمة. لن ينتقل إلى الكلمة التالية في كل مرة تسميها. لذلك إذا كان لديك هذا كرمز الخاص بك:

char * line = "this is a line of text";

ثم في كل مرة يطلق عليها SSCANF ، سيتم تحميل "هذا" إلى كلمة. ولأنه يقرأ كلمة واحدة في كل مرة ، سوف SSCANF دائماً العودة 1.

هذا سيساعد:

char dest[10], source [] = "blah blah blah!" ;
int sum = 0 , index =0 ;
while(sscanf(source+(sum+=index),"%s%n",dest,&index)!=-1);
printf("%s\n",dest) ;

ستقوم "Strtok" بتقسيم سلسلة الإدخال استنادًا إلى بعض المحررين ، في حالتك ، سيكون المحدد مساحة ، وبالتالي سيعود مجموعة من "الكلمات" وستأخذ ببساطة آخرها.

http://www.cplusplus.com/reference/clibrary/cstring/strtok/

يمكن للمرء أن يوضح العديد من الطرق المختلفة لأداء هذه العملية ثم تحديد أي واحد يحتوي على أفضل خصائص الأداء والقدرة على الاستخدام ، أو مزايا وعيوب كل منها ، أردت ببساطة توضيح ما ذكرته أعلاه مع مقتطف رمز.

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

int main()
{
    char line[] = "This is a sentence with a last WoRd ";

    char *lastWord = NULL;
    char *token = strtok(line, " ");
    while (token != NULL)
    {
        lastWord = token;
        token = strtok(NULL, " ");      
    }

    while (*lastWord)
    {
        printf("%c", tolower(*lastWord++));
    }

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