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

مشكلتي ودالة strlen

مغلق
بدأه Wase3 Sadr في 24 مارس 2005 · 8 رد · 672 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ..

إخواني .. لدي كود يقوم بإستخدام مصفوفة من char تحتوي على ارقام داخلها ..

وأريد قلب المصفوفة ..

المشكلة عند محاولة إستخدام الـ swap يكون الناتج .. شاشة خطأ الويندز المعروفة ( الموجودة بالمرفق )

هذا هو الكود :

#include <iostream>
#include <string>

using namespace std;

int main()
{
	char *a = "1234";
	int n = strlen (a);
	char temp;
	for(int i = 0; i < n/2; i++)
	{
  temp = a;
  a = a[n-1-i];
  a[n-1-i] = temp;
	}

	cout << a;

	return 0;
}

ما الحل مع هذه المشكلة ؟؟ فأنا بحاجة للحل بأسررررع وقت :(

شكرا لكم

post-34217-1111673050_thumb.gif

#2

أخى أنظر لهذا الكود لعل وعسى أن يساعدك

#include <iostream>
#include <stdlib.h>

using namespace std;

int main(int argc, char *argv[])
{
    char *a = "1234";
    int count =3;
    char p[count]; 
    
    
    for(int i = 0; i < strlen(a); i++)
    {    
         p[count]= *(a+i);   
         count--;  
     }
     
     for (int k=0; k<strlen(a); k++)
     {
         cout<< p[k]<<" ";

     }
     cout<<endl;

  system("PAUSE");	
  return 0;
}
#3

السلام عليكم

غير التعريف إلى التالي

char a[] = "1234";
#4

تمام ضبطت معي عند تغيير التعريف إلى char a[]

لكن المشكلة .. إنني أريد كتابتها كدالة داخل class تستقبل char *a وتعيد char * ايضا ..

ما الحل !!

كمثال :

char *HugeInt::swap(char *s)
{
	int size = strlen (s);

	char *t=s;
	for ( int i=0; i < size/2; i++)
	{
  char x = t;
  t=t[size -i - 1];
  t[size - i - 1]=x;
	}

	return t;
}
#5
#include <iostream>
#include <string>

char *swap(char *s)
{
int size = strlen (s);

char *t=s;
for ( int i=0; i < size/2; i++)
{
 char x = t;
 t=t[size -i - 1];
 t[size - i - 1]=x;
}

return t;
}

using namespace std;

int main()
{
char a[] = "1234";

char *b=swap(a);

cout << b<<endl;
//or
cout << a<<endl;

return 0;
}
#6

أخوي الغالي the Smart بارك الله فيك .. وجزاك ألف خير ..

لكن .. إذا تسمح لي .. أحب انك تشرح لي خطأي .. وما الذي حصل بالتحديد ..

حتى لا أقع في نفس الخطأ في كل مره :)

تحياتي

Wase3 _Sadr

#7

السلام عليكم

الخطأ لديك أنك لم تفهم المؤشرات أو pointer وتمريرها للدوال

و الفرق بينها وبين المصفوفات

#8

هذا السطر

char *t=s;

لا اعتقد ان له فائدة كبيرة, لأنه مجرد pointer آخر يتصرف بالظبط مثل s, لذلك لا داعي للـ

return t;

لأنك لا ترجع شيئا جديدا ..

لاحظ عندما تنفذ السطر:

char *b=swap(a);

فإن المتغيرين a و b هنا pointers يشيران لنفس الشيء.

فهذين السطرين

cout << b<<endl;
//or
cout << a<<endl;

يؤديان نفس المهمة بالظبط.

المشكلة الأصلية تكمن في شيء بسيط:

لما تسوي:

char *a = "1234";

فإن a يشير الى منطقة في الذاكرة تحتوي هذا النص, لكن هذه المنطقة لا تستطيع تغييرها (لا اعرف لماذا بالظبط) فهي تصبح منطقة للقراءة فقط.

لكن عندما تعملها على شكل array فعندئذ تستطيع الوصول الى عناصر الـ array و تغييره. لأنه (حسب ما قرأت) إن محتويات الـ string الي هو "1234" يتم نسخها الى الـ array.

و المشكلة ليس لها علاقة بـ strlen لأنه تعمل بشكل صحيح حتى مع الـ pointers, المشكلة تحصل في هذا السطر:

a = a[n-1-i];

عندما تحول تغيير محتويات الـ constant string

تم تعديل هذه المشاركة بواسطة hasan_aljudy في 24 مارس 2005 في 23:11

#9

السلام عليكم

شكراً أخي hasan_aljudy على الشرح

بالنسبة لما شرحته أنا أعرف أني وضعت أشياء لا نحتاج لها ولكن لكي أجعل الكود أقرب ما يكون لما كتبه فبالتالي يستطيع فهمه أسرع

ولذلك لقد وضحت له أن a وb يشيران لنفس المنطقة في الذاكرة عندما كتب جملة الطباعة ل a و b .

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

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