الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة في دالة لتفريغ النصوص من الفراغات المتعددة وابقاء فراغ واحد فقط .؟

مغلقمُجاب
بدأه Install في 9 مارس 2014 · 4 رد · 1,224 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته .

لدي مشكلة في دالة قمت ببرمجتها الدالة تأخذ نص مثال "odsijfi          x,mcnv,xmcvnxcmvn                    asdasd"

تقوم بتحويل المساحات الفارغة Empty spaces إلى فراغ واحد فقط اي يفترض ان يكون الخرج  "odsijfi x,mcnv,xmcvnxcmvn asdasd"

الهدف من هذه العملية انني اريد الحصول على السلسلة النصية التي في المنتصف اي "x,mcnv,xmcvnxcmvn"

 

حيث لا اعرف كم فراغ سيكون في النص المدخل لذلك لااستطيع استخدام الدالة Substr في ذلك او اي دالة اخرى 

 

هذه هي الدالة التي قمت ببرمجتها 

 string st = "   XXXXXXX     UUUUUUUUU   ZZZZZZZZZZZ";    cout << st << '\n';    //cin >> st;    string ResultedStr = "";    string TempStr = "";    char *cArray = new char[st.size() +1];    cArray[st.size()] = 0; // إعطائها علامة Null-Terminited Character    memcpy(cArray,st.c_str(),st.size());    for(int i = 0; i < st.size(); i++) // حذف كل الفراغات وإبقاء فراغ واحد فقط لاغير    {        if((cArray != ' ') && (cArray[i + 1] != ' '))        {           TempStr += cArray;        }        else if((cArray != ' ') && (cArray[i + 1 == ' ']))        {           TempStr += cArray + ' ';        }    }    stringstream strstr; //(tempF);    cout << TempStr << '\n';    strstr.str(TempStr);    string mystr1;    strstr >> mystr1;    string mystr2;    strstr >> mystr2;    cout << mystr2;

"آخر / اسطر للحصول على الكلام الذي في المنتصف عن طرق التعامل مع السلسلة النصية الناتجة ك Stream   :lol:

 

ولكن المشكلة العجيبة الغريبة التي لم استطع ان اجد لها اي تفسير هي ان الدالة تخرج السلسلة النصية التالية

XXXXXXXxUUUUUUUUUuZZZZZZZZZZZ

اي بدل الفراغ الواحد نسخت المحرف الأخير وحولته إلى Small Letter

 

حاولت استبدلت السلسلة النصية بسلسلة نصية تحوي رموز مثل # وارقام عشرية وفراغات وحروف 

 

والناتج كان اكثر غرابة كان يفصل بين الاقسام بدل الفراغ الواحد علامة غريبة من الشكل التالي "+R" وفي المنتصف "+OCR"

 

ماهذا ؟؟؟ ولماذا حصل 

 

 

ولكم جزيل الشكر اخواني الأعزاء

تم تعديل هذه المشاركة بواسطة Install في 9 مارس 2014 في 12:08

{ وَيَوْمَ تَقُومُ السَّاعَةُ يُقْسِمُ الْمُجْرِمُونَ مَا لَبِثُوا غَيْرَ سَاعَةٍ ۚ كَذَٰلِكَ كَانُوا يُؤْفَكُونَ () وَقَالَ الَّذِينَ أُوتُوا الْعِلْمَ وَالْإِيمَانَ لَقَدْ لَبِثْتُمْ فِي كِتَابِ اللَّهِ إِلَىٰ يَوْمِ الْبَعْثِ ۖ فَهَٰذَا يَوْمُ الْبَعْثِ وَلَٰكِنَّكُمْ كُنْتُمْ لَا تَعْلَمُونَ } الروم 55-56

#2

لديك فئة string تعطيك العديد من الوظائف المفيدة للبحث والإستبدال، لاتحتاج معها للتعامل مع النص كمصفوفة خام. مثلا إذا كنت تريد توحيد المسافات، فابحث باستخدام find عن كل مسافتين واستبدلهم بواحدة replace إلى أن تنتهي:

 

#include <iostream>
#include <string>

std::string& unispace(std::string& s)
{
  size_t p;

  while( (p = s.find("  ")) != std::string::npos )
    s.replace(p, 2, " ");

  return s;
}

int main(int argc, char **argv)
{
  std::string str = "odsijfi          x,mcnv,xmcvnxcmvn                    asdasd";
 
  std::cout << unispace(str) << std::endl;

  return 0;
}
1
#3

ماشاء الله عليك اخي فكرة رائعة فعلاً ولكن لو كانت المسافات بعدد فردي وليس زوجي فمالعمل ؟؟

مارأيك لو وضعت استدعاء لهذه الدالة ضمن حلقة While ووضعت الشرط ان عدد المسافات يكون < 3 

انا احتاج لثلاث مسافات فارغة فقط بين كل قسم نصي  قد لاتنفع ايضاً هذه الفكرة لان المسافات ممكن ان تتوضع بهذا الشكل

ٍSection1Section2   Section3

أنا اريدها ان تتوضع بهذا الشكل

Section1 Section2 Section3

----------

 

واخي هل لديك تفسير برمجي لما حصل في الأعلى فلم افهم لماذا حصل ذلك إلى الآن ؟؟

تم تعديل هذه المشاركة بواسطة Install في 9 مارس 2014 في 16:58

{ وَيَوْمَ تَقُومُ السَّاعَةُ يُقْسِمُ الْمُجْرِمُونَ مَا لَبِثُوا غَيْرَ سَاعَةٍ ۚ كَذَٰلِكَ كَانُوا يُؤْفَكُونَ () وَقَالَ الَّذِينَ أُوتُوا الْعِلْمَ وَالْإِيمَانَ لَقَدْ لَبِثْتُمْ فِي كِتَابِ اللَّهِ إِلَىٰ يَوْمِ الْبَعْثِ ۖ فَهَٰذَا يَوْمُ الْبَعْثِ وَلَٰكِنَّكُمْ كُنْتُمْ لَا تَعْلَمُونَ } الروم 55-56

#4 أفضل إجابة
Install كتب:

ولكن لو كانت المسافات بعدد فردي وليس زوجي فمالعمل ؟؟

حينها لايمكنك الإعتماد على المسافة، لو تعيد النظر لمثالك ستجد أنك لم تقسمها باستخدام المسافة، كانت:

Section1Section2   Section3

ثم أصبحت:

Section1 Section2 Section3

على أي أساس فصلت Section1 عن Section2؟ هل ترى المشكلة؟

 

بالنسبة للأحرف الصغيرة، فالمشكلة لديك هنا:

TempStr += cArray + ' ';

جمع (وليس وصل) cArray مع المسافة سينفذ اولاً، يسنتج حرف يوصل مع TempStr، قيمة المسافة 32 وجمع حرف كبير مع 32 (المسافة) سيعطيك الحرف الصغير منه:

X = 88
x = 120
space = 32

x - X = 32 = space => X + space = x
1
#5

حدث خطأ

لقد وصلت إلى الحد الأقصى للنقاط الإيجابية لهذا اليوم

 

 

 

ياأخي اقسم بالله مااعرف كيف اوجه شكر يليق بك وبخبرتك 

بارك الله فيك وجزاك الله عني كل خير فهو يجزي بالخير افضل من العباد 

 

فعلا فعلا كانت المشكلة انني اجمع char مع char وكما نعلم ان كل لغات البرمجة في الدنيا تعتبر ان char رقمي ولكن تمثله بشكل نصي 

 

آآآآه كيف نسيت 

فعلا اخي حليت المشكلة بفضل الله عز وجل ثم بفضلك جزاكم الله خير 

المشكلة حلت والخرج الآن مثل العسل  :lol:

وهذا الكود بعد التعديل 

    string st = "   XXXXXXX     UUUUUUUUU   ZZZZZZZZZZZ";    cout << st << '\n';    string ResultedStr = "";    string TempStr = "";    string currStr = "";    char *cArray = new char[st.size() +1];    cArray[st.size()] = 0;    memcpy(cArray,st.c_str(),st.size());    for(int i = 0; i < st.size(); i++)    {        if((cArray != ' ') && (cArray[i + 1] != ' '))        {           TempStr += cArray;        }        else if((cArray != ' ') && (cArray[i + 1 == ' ']))        {            currStr = cArray;            TempStr += currStr + " ";        }    }    stringstream strstr; //(tempF);    strstr.str(TempStr);    string mystr1;    strstr >> mystr1;    cout << mystr1 << '\n';    string mystr2;    strstr >> mystr2;    cout << mystr2 << '\n';    string mystr3;    strstr >> mystr3;    cout << mystr3 << '\n';

بارك الله فيك اخي العزيز 

انا كل ما كنت اريد هو ان البرنامج سيتم الإدخال إليه جملة نصية لا على التعيين ولكن فيها عدد كبير من الفراغات غير معروف ولكن موزع على الشكل التالي :

--Spaces--Section1---Spacess---Section2---Spacess--Section3

 

كما ترى يبدأ السطر الذي سوف يتم إدخال بعدد غير معروف من الفراغات "قد تكون خمس او عشرة او عشرين ومن ثم جملة نصية مثل "world" مثلاً ثم فراغات ثم جملة نصية ثم فراغات

انا كنت اريد الحصول على ثاني جملة نصية فيها رقم رياضي من النوع Double يحوي نتيجة تنفيذ برنامج آخر 

وهكذا حققت ما اريد عن طريق اولا حذف الفراغات من بداية النص فيصبح النص من الشكل التالي

Seciton1            secition2     section3

ومن ثم تقليل عدد الفراغات بين السلاسل النصية الثلاثة إلى فراغ واحد فقط حتى استطيع ان اخذ القسم الثاني عن طريق التعامل معهم ك String stream واحد فقط

 

جزاك الله خير مرة اخرى اخي العزيز وشكرا على الإفادة

{ وَيَوْمَ تَقُومُ السَّاعَةُ يُقْسِمُ الْمُجْرِمُونَ مَا لَبِثُوا غَيْرَ سَاعَةٍ ۚ كَذَٰلِكَ كَانُوا يُؤْفَكُونَ () وَقَالَ الَّذِينَ أُوتُوا الْعِلْمَ وَالْإِيمَانَ لَقَدْ لَبِثْتُمْ فِي كِتَابِ اللَّهِ إِلَىٰ يَوْمِ الْبَعْثِ ۖ فَهَٰذَا يَوْمُ الْبَعْثِ وَلَٰكِنَّكُمْ كُنْتُمْ لَا تَعْلَمُونَ } الروم 55-56

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…