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

اضافة Char الى Char* او String ؟؟

بدأه مجلـد جديـد في 13 أغسطس 2008 · 8 رد · 899 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

الدالة تقوم باضافة حرف واحد ( من A الى Z ) الى كلمة معطاه في كل الاماكن الممكنة(وعددها يساوي n+1 اي عدد الاحرف زائدا واحد):

  1.  
  2. void add(char* sd)
  3. {
  4. string word;
  5. for( char c = 'A' ; c <= 'Z' ; c++ )
  6. for( int i=0 ; i < strlen( sd )+1 ; i++ )
  7. {
  8. word = sd;
  9. word.insert(i,&c);
  10. cout << word << endl;
  11. }
  12. }
  13.  

المشكلة الاولى: هل يمكن الاستغناء عن string word ؟؟ كيف يمكن عمل دالة تقوم بنفس عمل insert ؟؟

المشكلة الثانية هي المخرجات الغريبة، مثلا عند ادخال كلمة ahmed :

post-73304-1218644525_thumb.png

!!

#2

السلام عليكم

هذا تعديل بيسط على الكود ارجو ان يفي بالغرض

  1.  
  2. #include <cstdlib>
  3. #include <iostream>
  4. #include<string>
  5. using namespace std;
  6.  
  7.  
  8.  
  9. void add( char* sd)
  10. {
  11. char * a;
  12. int f=0;
  13. for( char c = 'A' ; c <= 'Z' ; c++ )
  14. {
  15. a=sd;
  16. f++;
  17. for( int i=0 ; i < strlen( sd ) ; i++ )
  18. {
  19. (f==i)?cout<<c: cout << *a++;
  20. }
  21. cout<<endl;
  22. if (f>strlen( sd )) f=0;
  23. }
  24. }
  25.  
  26. int main(int argc, char *argv[])
  27. {
  28. char* s="ahmed";
  29. add(s);
  30. system("PAUSE");
  31. return EXIT_SUCCESS;
  32. }
  33.  
  34.  

تم تعديل هذه المشاركة بواسطة فهدالشلوي في 13 أغسطس 2008 في 21:46

tvquran_6.gif

#3

شكرا لك اخي فهد ، ممكن تشرح الطريقة التي استخدمتها؟

انا قمت بالمحاولة وكتبت دالة تضيف حرف على كلمة معطاة ، المدخلات هي الكلمة ، والحرف ، ومكان الحرف index :

  1.  
  2. char* insert( char* s, char c, int i )
  3. {
  4. char* wordPtr = new char[ strlen(s)+1];
  5.  
  6. if( i==0 )
  7. {
  8. wordPtr[0]=c;
  9. for( int k=1 ; k < strlen(s)+1; k++ )
  10. wordPtr[k]= s[k-1];
  11. }
  12. else
  13. if( i == strlen(s))
  14. {
  15. for( int k=0 ; k < strlen(s) ; k++ )
  16. wordPtr[k] = s[k];
  17.  
  18. wordPtr[i] = c;
  19. }
  20. else
  21. {
  22. for( int k=0 ; k < i ; k++ )
  23. wordPtr[k] = s[k];
  24.  
  25. wordPtr[i] = c;
  26.  
  27. for ( int j=i+1 ; j <= strlen(s) ; j++ )
  28. wordPtr[j] = s[j-1];
  29. }
  30.  
  31. return wordPtr;
  32. }
  33.  
  34.  
  35.  

عندما تكون الكلمة مكونة من ثلاث احرف ( ali ) فان الرقم 0 يعني اضافة في الاول ، والرقم 1 يعني اضافة بعد الحرف a والرقم 2 يعني اضافة بعد الحرف l والرقم 3 يعني اضافة بعد الحرف i وهو الاخير.

والدالة مقسمه الى ثلاث اقسام، القسم الاول i==0 ويعني اضافة في الاول .

القسم الثاني i=strlen ويعني اضافة في الاخير

والقسم الثالث الاضافة بين الحرف الاول والاخير.

واصبحت المخرجات ممتازة ولا تظهر رموز غريبة.

تم تعديل هذه المشاركة بواسطة مجلـد جديـد في 13 أغسطس 2008 في 22:42

#4

هل الكود الذي في مشاركة 2 نفذ المطلوب ام انه مختلف ؟

tvquran_6.gif

#5

يدخل في infinite loop لحرف A .

هل لابد من وضع '\0' الذي يدل على نهاية الكلمة داخل مصفوفة من نوع char* ؟

#6

هل نسخت الكود باستخدام الامر الذي في الاعلى ام من خلال التحديد ثم النسخ.

تاكد من صحه النسخ فالكود يعمل جيدا.

او انسخه ثم تاكد من علامات +

tvquran_6.gif

#7

اخوي فهد ، شكرا لك على متابعة الموضوع :)

البرنامج كامل هذا هو:

  1.  
  2.  
  3. #include <iostream>
  4. using std::cout;
  5. using std::endl;
  6.  
  7. #include <string>
  8. using std::string;
  9. using std::strcpy;
  10.  
  11. void foo( string );
  12. char* insert( char*, char, int );
  13. char* stringToChar( string& );
  14.  
  15. int main()
  16. {
  17. string word = "test";
  18. foo( word );
  19. return 0;
  20. }
  21.  
  22. void foo( string word )
  23. {
  24. char* sd = stringToChar( word );
  25.  
  26.  
  27. char* sdPtr;
  28. for( char c = 'A' ; c <= 'Z' ; c++ )
  29. for( int i=0 ; i < strlen( sd )+1 ; i++ )
  30. {
  31.  
  32. sdPtr = insert( sd, c, i);
  33. cout << sdPtr << endl;
  34. delete [] sdPtr;
  35. }
  36.  
  37. }
  38.  
  39. char* insert( char* s, char c, int i )
  40. {
  41. char* wordPtr = new char[ strlen(s)];
  42.  
  43. if( i==0 )
  44. {
  45. wordPtr[0]=c;
  46.  
  47. for( int k=1 ; k < strlen(s)+1 ; k++ )
  48. wordPtr[k]= s[k-1];
  49. }
  50. else
  51. if( i == strlen(s))
  52. {
  53. for( int k=0 ; k < strlen(s) ; k++ )
  54. wordPtr[k] = s[k];
  55.  
  56. wordPtr[i] = c;
  57. }
  58. else
  59. {
  60. for( int k=0 ; k < i ; k++ )
  61. wordPtr[k] = s[k];
  62.  
  63. wordPtr[i] = c;
  64.  
  65. for ( int j=i+1 ; j <= strlen(s) ; j++ )
  66. wordPtr[j] = s[j-1];
  67. }
  68.  
  69. return wordPtr;
  70. }
  71.  
  72. char* stringToChar( string& s )
  73. {
  74. const char* t1Ptr = s.c_str();
  75. int length = strlen( t1Ptr );
  76.  
  77. char* t2Ptr = new char[ length ];
  78. strcpy( t2Ptr, t1Ptr );
  79.  
  80. return t2Ptr;
  81. }
  82.  
  83.  

المخرجات المطلوبة في هذا البرنامج هي كتالي:

Atest

tAest

teAst

tesAt

testA

وهكذا لبقية الحروف ، المشكلة هو ظهور الرموز الغريبة في اخر كل كلمة :

post-73304-1218744014_thumb.png

ماهو الخطأ في رأيك ؟

اود ان اوضح انه عندما تأخذ دالة foo المدخل كـ char* بدلا من string ( حتى يتم الاستغناء عن دالة stringToChar) فان المخرجات تكون صحيحة وتظهر بدون رموز غريبة.

#8

السلام عليكم هذه الدالة فقط string

هل تريدها فقط بـ char

#include <iostream>
using namespace std;
void add( string word)
{
string tmp;
for( char c = 'A' ; c <= 'Z' ; c ++  )
    for( int i=0 ; i <word.size()+1 ; i++   )
            {
            tmp=word;
            tmp.insert(i,1,c);
            cout << tmp << endl;
            }
}
int main()
{
    add("test");
    getchar();
    return 0;
}
tvquran_6.gif

#9

شكرا اخوي فهد

هذا بالضبط الي ابحث عنه

الان المخرجات سليمة 100% :)

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