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

استخدام string في c هل هو ممكن

مغلق
بدأه أبو ماجد الصارم في 15 يناير 2003 · 21 رد · 1,120 مشاهدة · في ارشيف قسم C/C++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

من المعلوم في لغة سي أن سلاسل الحروف عبارة عن مصفوفة حروف من نوع char لكن لدي مشكلة وهي أنني بحاجة إلى إرجاع قيمة من نوع سلسلة حروف من دالة فرعية ولكن هذا غير ممكن بالطريقة التالية:

char func()

{

    char str[255];

    ..........

    .........

    return str

}

فهل هناك نوع آخر ممكن استخدامه؟

#2

أخ ابو ماجد جرب استخدام LPSTR بدلا من char

مثلا

LPSTR lpstr()

{

LPSTR lpwin;

GetWindowsDirectory(lpwin,strlen(lpwin));

return lpwin;

};

.

.

.

int main()

.

cout<<lpstr();

هل هذا ما تقصده ...

#3

أخي استعمل المؤشر ات pointer و تنحل المشكلة ، لأن المؤشر عبارة عن عنوان لسلسة حرفية وليس هو السلسلة الحرفية بالنفس

و هذا مثال بسيط

#include<stdio.h>

char * function (void);

void main (void)

{

       char * X;



       X= function();

       printf("%s",X);

       getchar();

}



char* function (void)

{

   char * a;



   a = " Let me think!! ";

   return (a);

}

و الطريقة التي أعطها لك الأخ محمد هي استخدام الموشرات في عالم الويندز

فمصلطح LPSTR تدل على Long pointer string

#4
#include 

string func(){
 string name;
............
.............
..........
return name;
}

اختكم

لغة سي

#5

ماهذه الكفريات في اللغة التي أراها هنا من قبل حل c_language ..:eek:

mhammad:

مافرق LPSTR عن char * أو char[] ..؟

طبعا كلهم واحد!

وكيف تقوم باستدعاء strlen على مؤشر لم تقم بتحديده أساسا! :confused:

GetWindowsDirectory يجب أن يكون هناك مساحة كافية من أجل نسخ الدليل ولكن أي حجزك للمساحة بحلك !

Al-saidi:

حلك ليس صحيح لأنه قد يعمل في بعض المترجمات ولن يعمل في البعض الآخر وهذا يعتمد على كيفية حفظ السلاسل المباشرة في المترجم .. بالنسبة لحلك أستطيع أن أجعله يعمل في الفجوال سي وأيضا أسطتيع أن أجعله لا يعمل ;) .. بعض المترجمات تقوم بتكوين السلسلة في المكدس داخل التابع وبالتالي السلسلة تختفي عند الخروج من التابع .. وأنت طبعا ترجع قيمة لمؤشر السلسلة وهي في المكدس ..

أما بعض المترجمات الأخرى فإنها تضع السلسلة التي ذكرتها في ال resource وتكون دائما في الذاكرة وهكذا تعمل .

===============

طبعا الأخ طلب حل في السي وإن كان السي++ لكان حل أختنا السي صحيح ..

أعتقد في هذه الحالة الأفضل هو أن يتم حجز السلسلة داخليا باستخدام malloc ومن ثم عند الانتهاء منها استخدام free لتحرير المساحة من الذاكرة .. وهذا المثال :

char *GetString() 

{

     char *ptr = (char*)malloc(20);

     // copy the string now

     strcpy(ptr, "any str");

     return ptr;

}



void main()

{

    char *str = GetString();



    // ... use the str



    free(str);    // free when done

}

Coding on the Cloud and for the Cloud!

My Blog

#6

ولا يهمك أخ هاني

char * lpstr()

{

char* lpwin = new char[256];

GetWindowsDirectory(lpwin,strlen(lpwin));

return lpstr;

}

بس انا كان قصدي انه يستخدم المؤشرات:o

#7

على فكرة لا يوجد new في السي.. هي فقط في السي++

Coding on the Cloud and for the Cloud!

My Blog

#8

أخي هاني أنا آسف على هذا الغلط :o

لكن أنا بصراحة جربته في بورلند 5.02 و فيجوال فياليت لو تبين لي كيفية يتم جعل هذا البرنامج لا يعمل في الفيجول .

ثم لو توضح لي كيفية يتم تعريف السلسلة في المكدس بدون استخدام المتغير register ??

ثم لو أردنا أن نرجع سلسلة حرفية غير معلومة الطول بواسطة مؤشر فكيف يتم ذلك بأقل إستهلاك مساحة من الذاكرة ؟؟

#9

جرب هذا وأعطني رأيك :

char * getstr()

{

	char p[] = "test";

	return p;

}



int main(int argc, char* argv[])

{

	char * str = getstr();

	cout << str << endl;



	return 0;

}

لم أفهم هذا السؤال : ثم لو توضح لي كيفية يتم تعريف السلسلة في المكدس بدون استخدام المتغير register ??

وأرجو التوضيح أكثر بالنسبة للسؤال الثالث ..؟:confused:

Coding on the Cloud and for the Cloud!

My Blog

#10

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

الى الاخ هاني

لم افهم قصدكم

هل استخدام string غير صحيح ؟؟؟

ام ماذا

اختكم

لغة سي

#11

صحيح ولكن على حد علمي السائل يسئل في سي وليس سي++ ..

Coding on the Cloud and for the Cloud!

My Blog

#12

غريب

انا اعمل على سي ++ وامر استخدام string عادي لم تحدث اي مشاكل معي

ممكن التوضيح اكثر :)

اختكم

لغة سي

#13

أختي لغة السي...

السؤال عن لغة (سي) , وإجابتك بلغة سي++

#14

اهاه

اللحين فهمت :)

اذن لماذا لا ياخذ نسخه من الملف steing.h ويضعه في البرنامج السي ؟

اختكم

لغة سي

#15

الأستاذ هاني ...

يعني استفيد من كلامك إن الدوال اللي ترجع pointer to char تعتبر خطرة نوعا ما .. عند محاولة تعميم البرنامج .( يعني تشغيله على عدة مترجمات)

- بس ما راح يكون له أي تأثير أتوقع لو كان في صيغة تنفيذيه .. هل هذا صحيح ؟

>>>> حلوة كلمة كفريات .. والله كنت مولم الرد .. في البداية لين شفت اسمكم الكريم <<<

014.gif
#16

أخ بطران :

موضوع الخلاف بين المترجمات هو في كيفية التعامل مع السلسلة فبعضهم يعاملها كمصفوفة والبعض يضعها في الذاكرة الدائمة ..

لا أفهم ماذا تقصد أنه لا يكون لها تأثير في الصيغة التنفيذية .. فالمترجم بالنهاية على كل الحالت يحولها إلى صيغة تنفيذية طبعا بعد عملية الربط ..

الكفر هنا ليس الكفر بالدين .. أنا قلت كفريات في اللغة وهي تعني خطأ كبير قد ارتكب في حق السي :D

Coding on the Cloud and for the Cloud!

My Blog

#17

the best way to do it is as hany said

in this way

char* Proc(void)
{
     char a[] = "test";
     return a;
}

the array is pushed on the stack so when the function returns it's popped ( deleted ) so the returned pointer is pointing to none

there is another way

#define MAX_PATH 256
typedef char[MAX_PATH] string;

string Proc(void)
{
    string a = "test";
    return a;
}

for sister c_language 'string' is a specialization of a template and neither classes nor template is supported in C

salam

#18

أخي m_tayseer

لكني لم أقل أن هذه هي الطريقة الصحيحة ,, أنا كنت أشير أن هذا الكود لن يعمل في فجوال سي++ .. والطريقة الثانية التي ذكرتها مشابهة للطرق الأخرى الخاطئة المذكورة أيضا في الأعلى .. :confused:

Coding on the Cloud and for the Cloud!

My Blog

#19

السلام عليكم ,,,

عزيزتي لغة السي:

عندما تستخدمين الـ String من الملف string.h فهو لن يعمل في لغة سي

لأن التابع String يعتبر كلاس و هذا مالا تدعمه لغة سي :)

أستاذي هاني:

(f) كفيت ووفيت ما شاء الله عليك.

فينك عن القسم من زمااااااااااااااااااان ;)

#20

اهاه

اللحين عرفت

ما هو الفرق بين سي و سي ++

اختكم

لغة سي

#21

السي هي قبل السي++ ... وتفتقر ل class و template .. يمكن اعتبارها نسخة OOP من السي .. طبعا في السي++ يوجد STL و عدة مكاتب قياسية ظهرت معها ...

Coding on the Cloud and for the Cloud!

My Blog

#22

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

صحيح كنت أقصد في سؤالي لغة سي ولكنني حولت برنامجي إلى سي++ نظراً لسهولة استخدام string (وكأني في باسكال) مقارنة بمشاكل المؤشرات

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

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