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

التعامل مع السلاسل النصيه الخاصه ببئة التشغيل

بدأه mhewedy في 26 أغسطس 2010 · 10 رد · 841 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

لا أعرف ما إذا كان العنوان غير مناسب أم لا.. لكن دعنى أقص عليكم سؤالي....

كيف يتم التعامل مع السلاسلا النصيه الخاصه ببئية التشغيل التي يتم إستخدامها بهذه الطريقة:

char *str = "HELLO";

حسب ما أعرف أن str سوف يشير إلى char array موجود عند بيئة التشغيل (أو شئ من هذا القبيل) , إذن هو ليس تحت سيطرة المتغير المسمى str ...

فكيف يمكن التعديل على قيمته؟؟ حيث أن هذا البرنامج يعطي segmentation fault :

#include <stdio.h>
#include <string.h>

void modify_content(char *str)
{
	*str = 'A';
}

int main(void)
{
	char *str = "HELLO";
	modify_content(str);    	// segmentation fault !!	

	return 0;
}

ملحوظه.. لا أريد إستخدام هذه الطريقة:

char *str = (char*) malloc(sizeof str);
	strcpy(str, "HELLO");
#2

شوف هذه الطريقة أخ هويدي

و بتذكر في إحدى مرات كان في مشكلة بخصوص هل عنوان السلسلة المحرفية هو السلسلة المحرفية نفسها ؟ أم أن لها عنوان مثل بقية المتحولات

#include"stdafx.h"
#include<iostream>
#include <stdio.h> 
#include <string.h> 
 using namespace std;
char* modify_content(char *str) 
{ 
  str="a";
  return str;
} 

int main(void) 
{ 
    	char *str = NULL;
  str="Hello";
  str=modify_content(str);            	
  printf(str);
    	return 0; 
}

هذا هو رابط المناقشة في موضوع عنوان السلسلة المحرفية

http://www.alepposoft.net/info/showthread.php?t=24238

#3

أنت غير القيمة التي يشير إليها المؤشر str :

str = "a";

هل هذا هو الحل الوحيد إذن ؟؟ جاري الإطلاع على الموضوع

أظن الموضوع يتحدث عن مشكلةأخري و هي مشكلة تمرير المعاملات من نوع char* لل operator << ...... اليس كذلك ؟

تم تعديل هذه المشاركة بواسطة هويدي في 26 أغسطس 2010 في 23:35

#4
اقتباس
أظن الموضوع يتحدث عن مشكلةأخري و هي مشكلة تمرير المعاملات من نوع char* لل operator << ...... اليس كذلك ؟

لكن حتى لو طبقت هذا الأمر على printf ستجد نفس المشكلة

#5
اقتباس
فكيف يمكن التعديل على قيمته؟؟ حيث أن هذا البرنامج يعطي segmentation fault :

لن يمكنك تغييرها على الإطلاق و السبب هو ان الـ segment يشير لمنطقة الـ data و التى تم وضع النص بها، هذه المنطقه من الذاكره تم تحديد flag لها بأنها للقراءه فقط و بالتالى لن تستطيع تغييرها إلا إن قمت بتغيير خصائص الـ segment بجعله read-write (وذلك بجعل البت التاسع داخل الـ segment descriptor بواحد)

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

#6

أستاذ و الله يا أخ محمد .... أستاااااااااااااااااذ

إذن لجعل الداله تستقبل :

char* str = "ABC";

سنقوم بنسخ محتويات هذه السلسة في مصفوفه (أو بمؤشر أخر) بإستخدام (strcpy وخلافه) ... و من ثم نقوم بالتغير و في النهاية نجع المؤشر المرسل كمعاملات يشير إلى القيمة الأخيره .....

ألا يوجد طريقة أسهل .؟

#7
اقتباس
ألا يوجد طريقة أسهل .؟

دائما توجد طريقه اسهل :) ، انظر الكود التالى:

#include<stdio.h>

#define CREATE_STR(name,value) char name[sizeof(value)/sizeof(char)] = value;

int main()
{
	CREATE_STR(str, "Welcome in C++");
	printf(str);
}

الماكرو CREATE_STR يطلب منك اسم المتغير و النص الذى تريد ان تضعه داخله ثم يقوم بإنشاء متغير بنفس الإسم داخل الـ stack و ينسخ النص داخله.

الأن يمكنك التعامل مع المتغير str كأنه مؤشر لنص او مصفوفه، و ايضا يتم تحرير الذاكره الخاصه به بعد الخروج من الداله التى تم تعريفه بها، ولا احلى من ذلك.

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 27 أغسطس 2010 في 00:34

مدونتي: C++ Tips and Tricks

#8

جميل جدا.. ما شاء الله...

بصراحه.... انا شخصيا أعتبر ال MACROS في السي من أقوى ميزاتها ..... تستطيع أن تفعل بيها كل شئ و كل هذا في ال reprocessing time ....

#9
اقتباس
بصراحه.... انا شخصيا أعتبر ال MACROS في السي من أقوى ميزاتها ..... تستطيع أن تفعل بيها كل شئ و كل هذا في ال reprocessing time ....

الماكرو تحل العديد من المشاكل و تجلب أخرين لذا فأنا احاول أن اقلل من استخدامها قدر الإمكان، بالنسبه لسؤالك يوجد حل أخر و هو بإستخدام الثوابت فيمكنك تعريف ثابت لنص و من ثم الحصول على عنوان هذا الثابت (و تغييره إن إستطعت بإستخدام const_cast).

لاحظ ان الثوابت النصيه (التى تم تعريفها بـ const) يتم التعامل معها بشكل يختلف تماما عن اى من الأنواع الأخري، إن كنت تهتم بهذا الموضوع فيمكنك قرائة الفصل الذى يتحدث عن الثوابت بكتاب Thinking in C++ 2nd Edition.

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

#10

نعم.. لقد شاهدتها في الكود الذي قمتَ بكتابته في المسابقه...

لكن هذه في ال سي++ وحدها صح؟

#11
اقتباس
لكن هذه في ال سي++ وحدها صح؟

نعم هذا صحيح.

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

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

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

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

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

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