ahmed.o.mohamed

اختبر قدراتك في C/CPP - الحلقة الأولى

23 ردود في هذا الموضوع

السلام عليكم

مرحبا بكم في هذه السلسلة البرمجية التي سنتطرق فيها إلى مجموعة اختبارات تختلف باختلاف مستوى الصعوبة و كلما تقدمنا في السلسلة كلما زادت صعوبة الأسئلة إن شاء الله.

:: الإختبار الأول ::

اكتب دالة تستقبل عدد صحيح موجب كوسيط و تعيد أصغر عدد صحيح يمكن توليده من الرقم الأصلي.

مثال :

  • المدخلات : 7351
  • المخرجات 1357

سأضع حل السؤال بعد الإنتهاء من عرض المحاولات.

3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

تم استقبال محاولة الأخ مصطفى.

::__________________________::

حتى تكون المحاولات ذات فائدة, سأضع الطريقة التقليدية لحل السؤال لكي أستبعدها من النقاش :

#include<stdlib.h>
#include<stdio.h>
#include<math.h>

void Swap(char *X, int i, int j) {
int temp;
temp = *(X + i);
*(X + i) = *(X + j);
*(X + j) = temp;
}

void bubbleSort(char array[], int size) {
for (int i = 0; i <= size - 2; i++)
for (int j = 0; j <= size - i - 2; j++)
if (array[j] > array[j + 1])
Swap(array, j, j + 1);
}

int main() {
int nombre;
printf("N = ");
scanf("%d", &nombre);

int nbreDeChiffre = (int) (1 + log10(nombre));
char *chaine = (char*) malloc(nbreDeChiffre * sizeof (char));

sprintf(chaine, "%d", nombre);
bubbleSort(chaine, nbreDeChiffre);
printf("Min Number = %s\n", chaine);

free(chaine);
return 0;
}

بانتظار إبداعاتكم.

تم تعديل بواسطه أحمد الشنقيطي
Mise à jour
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

إذا سمحت لي بسؤال ..

هل استثناء الحل التقليدي ..يعني البحث عن حل آخر حتى لو كان معقداً أو طويلاً ..

وهل يعني الحل التقليدي استخدام العمليات التالية معاً في البرنامج :

1-تحويل العدد إلى مصفوفة أرقام ..

2-ترتيب المصفوفة تصاعدياً ..

3-تحويل المصفوفة المرتيبة إلى عدد ..

يعني إذا قمنا بحذف إحدى الخطوات .. فسيكون الحل غير تقليدي ... هل هذا صحيح ؟huh.gif...

أم أن الهدف هو البحث عن حل أفضل بجميع المقاييس ..؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

هل استثناء الحل التقليدي ..يعني البحث عن حل آخر حتى لو كان معقداً أو طويلاً ..

مُعقداً : نعم

طويل : لا :)

وهل يعني الحل التقليدي استخدام العمليات التالية معاً في البرنامج

نعم.

إذا قمنا بحذف إحدى الخطوات .. فسيكون الحل غير تقليدي ... هل هذا صحيح ؟

نعم, لكن يكون الحل غير تقليدي بنسبة معينة.

الهدف هو البحث عن حل أفضل بجميع المقاييس ..؟

بالضبط.

النقاط التالية تُؤخذ بعين الإعتبار :

  • توافق الكود مع المعيار القياسي لــ C أو CPP
  • قصر الكود
  • سرعة التنفيذ.
  • دعم الأعداد الكبيرة.
  • دعم الأعداد السالبة.
  • عدم وجود Bugs في الكود.

تم تعديل بواسطه أحمد الشنقيطي
Mise à jour
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أهلا يا أحمد

هذا ما خطر على بالي حاليا

بالنسبة للاعداد السالبة راح ما راح يكون فيه اختلاف, عن نفسي, أتخلص من الاشارة و اعكس العملية و اضرب الناتج في -1 و خلاص

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

int getMinimum(int number, int level) {
if(level == 0)
return number;
long minDigitPos = 1, temp = number/10, minDigit = number-(number/10)*10;
for(int i = 2; temp>0; i++, temp /= 10){
if((temp-(temp/10)*10) < minDigit)
{
minDigit = temp-(temp/10)*10;
minDigitPos = i;
}
}
return minDigit*(int)pow((float)10,(float)level)+getMinimum(number/(int)pow((float)10,(float)minDigitPos)*(int)pow((float)10,(float)minDigitPos-1)+number-number/(int)pow((float)10,(float)minDigitPos-1)*(int)pow((float)10,(float)minDigitPos-1), level-1);
}

int main() {
long number;
printf("N = ");
scanf("%d", &number);

int level = 0;
for(int i=number/10; i>0; i/=10)
level ++;

printf("Min Number = %d\n", getMinimum(number, level));

system("pause");
return 0;
}

تم تعديل بواسطه khatibe_30
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الطريقة التقليدية بــ C++ :

#include <sstream>
#include <iostream>
#include <algorithm>
using namespace std;

int main() {

int nombre;
cout << "N = ";
cin >> nombre;

ostringstream os;
os << nombre;
std::string str = os.str();

int nbreDeChiffre = str.length();
char *chaine = new char[nbreDeChiffre];

itoa(nombre, chaine, 10);
sort(chaine, chaine + nbreDeChiffre);

cout << "Min Number = " << chaine << endl;
delete []chaine;

return 0;
}

تم تعديل بواسطه أحمد الشنقيطي
Mise à jour
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

محاولات الأخ مصطفى

المحاولة الأولى, كانت تقليدية بامتياز :P

#include<cstdio>
unsigned int function(unsigned int);

int main() {
unsigned int a;
scanf("%u", &a);
printf("%u\n", function(a));
}

unsigned int function(unsigned int a) {
int i, j;
for (i = 1, j = 0; a > i; i *= 10, j++); //Test Number Size
if (j == 1)return a;
unsigned int buffer, min, Size = j;
unsigned int *A = new unsigned int[Size];
for (i = Size - 1; i >= 0; i--) {
A[i] = a % 10;
a /= 10;
}
for (i = 0; i < Size; i++) {
for (min = j = i; j < Size; j++)
if (A[j] < A[min])
min = j;
//Swap
buffer = A[i];
A[i] = A[min];
A[min] = buffer;
//End Swap
}
for (a = i = 0; i < Size; i++)
a = (a + A[i])*10;
return a / 10;
}

المحاولة الثانية لم أدقق النظر فيها بعد(سأخبرك بملاحظاتي لاحقا) :

#include<cstdio>
#define Byte unsigned char
unsigned int function(unsigned int);

int main() {
int a;
scanf("%u", &a);
if (a > 0)
printf("%u\n", function(a));
else {
printf("Please Enter A Positive Number\n");
main();
}
return 0;
}

unsigned int function(unsigned int a) {
Byte i, j, Size;
Byte min, min_index;
const Byte maximum_size = 10;
const Byte base10 = 10;
Byte *A = new Byte[maximum_size];
for (j = i = 0; i < maximum_size && a; i++) {
if (a % base10)
A[i - j] = a % base10;
else
j++;
a /= base10;
}
Size = i - j;
for (a = i = 0; i < Size; i++) {
for (min = 9, j = 0; j < Size; j++)
if (A[j] && A[j] < min) {
min_index = j;
min = A[j];
}
a = (a + min)*10;
A[min_index] = 0; //It's Like Delete This Element
}
return a / 10;
}

لكن كملاحظة أولية, كلا الكودين يملك مشكلة مع الصفر (جربهما مع العدد 101 مثلا :))

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

وعليكم السلام أخ محمد

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 50

void viderBuffer(void);
int lire(char **,int);
void rang(char **);
void affect(char **);

int main()
{
char *string=(char*) calloc(MAX,sizeof(char));

puts("entrer un numbre:\n");

if(lire(&string,MAX))
{
rang(&string);
affect(&string);
printf("\n\n==> %s\n\n",string);
free(string)
}


else {
printf("0\n\n""error allocation\n\n"); exit(0);
}


return 0;
}


void viderBuffer()
{
int c = 0;
while (c != '\n' && c != EOF)
c = fgetc(stdin);
return;
}

int lire(char **chaine, int longueur)
{
char *positionEntree = NULL;

if (fgets(*chaine, longueur, stdin) != NULL)
{
positionEntree = strchr(*chaine, '\n');

if (positionEntree != NULL)
{
*positionEntree = '\0';
}
else
{
viderBuffer();
}
return 1;
}
else
{
viderBuffer();
return 0;
}
}

void rang(char **p)

{
int i,j=0;
for(i=0;(*p)[i]!='\0';i++)
for(j=i;(*p)[j]!='\0';j++)
{
if((*p)[i]>(*p)[j])
{
(*p)[i]^=(*p)[j];
(*p)[j]^=(*p)[i];
(*p)[i]^=(*p)[j];
}
}
return;
}

void affect(char **p)

{
int i,j;
for(j=0,i=0;(*p)[i]!='\0';i++)
{
if((*p)[i] <58 && (*p)[i] >47 )
{
(*p)[j]=(*p)[i]; j++;
}
}
(*p)[j]='\0';
return;

}
/*
int* realloc_s(int **p,size_t* n)

{
int *q=(int*) realloc(*p,*n);
if(q!=NULL)
return q;
else
{
free(p);
return NULL;
}

}*/

1346700536221.jpg

لم أنته من كتابة الدالة realloc لضيق الوقت dry.gif ولكن على العموم الكود شغال

وأتمنى التوفيق لك و لباقي الأعضاء

تم تعديل بواسطه مومو (momo)
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

@مصطفى, ياسين

الصفر يجب أن يظهر حتى لو تكرر عدة مرات في بداية العدد (انظرا محاولة الأخ مومو كمثال).

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

حسنا

هذا التعديل مع اضهار الأصفار

#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#define p(a,b) (int)pow((float)a,b)

int getMinimum(int number, int level) {
if(level == 0)
return number;
long minDigitPos = 1, temp = number/10, minDigit = number%10;
for(int i = 2; temp>0; i++, temp /= 10){
if(temp%10 < minDigit)
{
minDigit = temp%10;
minDigitPos = i;
}
}
return minDigit*p(10,level)+getMinimum(number/p(10,minDigitPos)*p(10,minDigitPos-1)+number-number/p(10,minDigitPos-1)*p(10,minDigitPos-1), level-1);
}

int main() {
long number;
printf("N = ");
scanf("%d", &number);

int level = -1, zeroNbr = 0;
for(int i=number; i>0; i/=10){
level ++;
if(!(i%10))
zeroNbr++;
}

printf("Min Number = ");
for(int i=0;i<zeroNbr;i++)
printf("0");
printf("%d\n", getMinimum(number, level));

system("pause");
return 0;
}

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

حسنا

هذا التعديل مع اضهار الأصفار

#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#define p(a,b) (int)pow((float)a,b)

int getMinimum(int number, int level) {
if(level == 0)
return number;
long minDigitPos = 1, temp = number/10, minDigit = number%10;
for(int i = 2; temp>0; i++, temp /= 10){
if(temp%10 < minDigit)
{
minDigit = temp%10;
minDigitPos = i;
}
}
return minDigit*p(10,level)+getMinimum(number/p(10,minDigitPos)*p(10,minDigitPos-1)+number-number/p(10,minDigitPos-1)*p(10,minDigitPos-1), level-1);
}

int main() {
long number;
printf("N = ");
scanf("%d", &number);

int level = -1, zeroNbr = 0;
for(int i=number; i>0; i/=10){
level ++;
if(!(i%10))
zeroNbr++;
}

printf("Min Number = ");
for(int i=0;i<zeroNbr;i++)
printf("0");
printf("%d\n", getMinimum(number, level));

system("pause");
return 0;
}

أهلا أخ خطيب

هناك خطأ يسيط في السطر 25 حبيت أنبهك عليه لأن الساكت عن الحق شيطان أخرسlaugh.gif

C:\Documents and Settings\Administrator\My Documents\ddzdz\main.c||In function 'main':|
C:\Documents and Settings\Administrator\My Documents\ddzdz\main.c|25|warning: format '%d' expects type 'int *', but argument 2 has type 'long int *'| '/' token|
||=== Build finished: 0 errors, 1 warnings ===|

 long number;
scanf("%d", &number);

التصحيح

 long number;
scanf("%ld", &number);

وبالنسبة للكود الذي كتبته جربته و خرجت لي هذه الصورwacko.gif

1346711522811.jpg

1346711522902.jpg

وبالتوفيق أخي

تم تعديل بواسطه مومو (momo)
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

هذه أول مشاركة لي إذا سمح الأخ أحمد

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

typedef struct allocVar{
int size;
char * str;
}allocVar;

allocVar allocation();
void Min(allocVar number);

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

allocVar ptr;

printf("Enter number\n\n>>> ");
ptr = allocation();

Min(ptr);

printf("\n\n>>> %s\n",ptr.str);

return 0;
}
allocVar allocation()
{
allocVar alloc;
char c = 0;

alloc.size = 1;
alloc.str = NULL;

while((c = getchar()) != '\n')
{
alloc.size++;
alloc.str =(char *) realloc(alloc.str, sizeof(char) * alloc.size);
if(alloc.str == NULL)
{
printf("Allocation failled in allocation function!\n");
exit(0);
}
alloc.str[alloc.size - 2] = c;
}
alloc.str[alloc.size - 1] = '\0';

return alloc;
}

void Min(allocVar number)
{
char sorted_number [number.size];
char elements[11] = "1023456789";
int i = 0, itr = 0, index = 0;

for(i = 0; i < 10;i++)
{
for(itr = 0; itr < number.size ; itr++)
{
if(elements[i] == number.str[itr])
{
sorted_number[index] = number.str[itr];
index++;
}
}
}
sorted_number[number.size - 1] = '\0';
strcpy(number.str, sorted_number);
}

793147Sanstitre.jpg

تم تعديل بواسطه biginner2000
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أهلا أخ خطيب

هناك خطأ يسيط في السطر 25 حبيت أنبهك عليه لأن الساكت عن الحق شيطان أخرسlaugh.gif

C:\Documents and Settings\Administrator\My Documents\ddzdz\main.c||In function 'main':|
C:\Documents and Settings\Administrator\My Documents\ddzdz\main.c|25|warning: format '%d' expects type 'int *', but argument 2 has type 'long int *'| '/' token|
||=== Build finished: 0 errors, 1 warnings ===|

 long number;
scanf("%d", &number);

التصحيح

 long number;
scanf("%ld", &number);

وبالنسبة للكود الذي كتبته جربته و خرجت لي هذه الصورwacko.gif

1346711522811.jpg

1346711522902.jpg

وبالتوفيق أخي

الرقم 545454212212 لا يمكن حفظه في متغر long لهذا ما راح يقدر الكود يتعامل معه, إلا اذا تم قراءة الرقم على شكل سلسلة حرفية مثل ما عملت انت

أما الرقم الثاني فيتم ترتيبه عادي عندي

448272Sanstitre.png

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

هذا كود آخر باستعمال سلسلة حرفية

كل عدد يتم قراءته على حدا باستعمال getche_ و وضعه في مكانه المناسب في السلسلة

+

الكود سيقبل الأرقام فقط و يتجاهل الحروف :happy:

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

int main() {
char c, strNumber[256];
int strNumberLen, maxDigit = 1;

printf("N = ");
for(strNumberLen = 0, c = _getch(); c!=13; c = _getch(), strNumberLen++){
if(c < '0' || c > '9'){
strNumberLen--;
continue;
}
putc(c, stdout);
for(int i = 0; i < strNumberLen; i++)
if(c < strNumber[i]){
for(int j = strNumberLen; j > i; j--)
strNumber[j] = strNumber[j-1];
strNumber[i] = c;
maxDigit = 0;
break;
}
if(maxDigit)
strNumber[strNumberLen] = c;
maxDigit = 1;
}
strNumber[strNumberLen] = '\0';

printf("\nMin Number = %s\n", strNumber);
_getch();
return 0;
}

972885Sanstitre.png

تم تعديل بواسطه khatibe_30
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الرقم 545454212212 لا يمكن حفظه في متغر long لهذا ما راح يقدر الكود يتعامل معه, إلا اذا تم قراءة الرقم على شكل سلسلة حرفية مثل ما عملت انت

اسم الخطأ 0xC0000005: Violation d'accès يحدث نتيجة المحاولة للوصول إلى مكان غير مهيأ في الذاكرة

و لا أعرف هل ظهور هذا الخطأ له علاقة بتجاوزنا للمساحة المخصصة لمتغير من نوع LONG و هذا ما ظننته في البداية أم أن هناك أشياء في الكود هي التي أدت لظهوره

فمثلا عند كتابتي لعدد أكبر من العدد الأول لم يظهر عندي ذلك الخطأ و الدالة MAIN أرجعت القيمة 0 على أساس أن البنرامج يشتغل بشكل عادي

نعم هناك بعض الأخطاء التي ستظهر لك وتخبرك بأنك تجاوزت الحد المخصص ل LONG ولكن لا يتوقف البرنامج

PMQ57016.jpg

أما الرقم الثاني فيتم ترتيبه عادي عندي

جربت سلسلة من الأرقام ولم تظهر النتيجة بالشكل المطلوب

ولك أن تتأكد بنفسكdry.gif

Cld57016.jpg

بالتوفيق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جربت سلسلة من الأرقام ولم تظهر النتيجة بالشكل المطلوب

ولك أن تتأكد بنفسكdry.gif

Cld57016.jpg

بالتوفيق

:happy:

لا أدري مابه الكومبايلر الذي تشتغل عليه أنت, طيب جرب هذا الملف التنفيذي مباشرة من عندي

http://www.mediafire.com/?mittkrbh2z7qsno

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

:happy:

لا أدري مابه الكومبايلر الذي تشتغل عليه أنت, طيب جرب هذا الملف التنفيذي مباشرة من عندي

http://www.mediafire...mittkrbh2z7qsno

لا أعلم من من الكومبايلرين يظهر نتائج مغلوطة هل الكومبايلر الذي أشتغل عليه أنا mellow.gifأم الذي تشتغله عليه أنت؟ happy.gif

على العموم سوف أجرب كودك في جهاز آخر و بكومبيلر آخر و سأقارن النتائج المحصل عليها حتى أعرف أي واحد منهما يظهر نتائج خاطئة؟؟

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

محاولتي :

#include<iostream>
#include<cmath>
using namespace std;

int main() {

long long number, s, d, z = 0, w = 1, x = 0, h = 1,m = 0, k = 0;
unsigned long long positiveNumber;
cout << "Entrez un nombre:";
cin >> number;

positiveNumber = abs(number);
s = positiveNumber;

while (positiveNumber > 0) {
d = positiveNumber % 10;
while (s > 0) {
z = s % 10;
if (d == z & d == m) {
x += m*h;
h *= 10;
d = z;
d = m;
}
if (d == z) {
m = d;
goto P;
}
if (d < z) {
x += m*h;
h *= 10;
d = z;
m = d;
} else {
x += z*h;
h *= 10;
}
P:
s /= 10;
}
positiveNumber = x;
s = x;
h = 1;
x = 0;
m = 0;
k += d*w;
w *= 10;
}

if (number < 0)
cout << "Les chiffres de " << number << " selon l'ordre croissant est "
<< -k << endl;
else
cout << "Les chiffres de " << number << " selon l'ordre croissant est "
<< k << endl;

return 0;
}

لدي أيضا فكرة أخرى قد تحل مشكلة الأعداد الكبيرة :

  • نقرأ العدد باعتباره string.
  • نبحث عن الحرف الذي يملك أصغر ASCII Code في السلسلة.
  • نُخزن الحرف في مصفوفة جديدة (ستحوي فيما بعد أرقام العدد بشكل مرتب).
  • نُبادل بين خانة الحرف الأصغر و آخر خانة من المصفوفة.
  • نحذف آخر خانة من المصفوفة.
  • نكرر الخطوات السابقة حتى تنتهي المصفوفة, عندها سنحصل على مصفوفة جديدة تحوي أرقام العدد الأصلي بشكل مرتب.

تم تعديل بواسطه أحمد الشنقيطي
Mise à jour
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

ما رأيك بتقييم محاولتك أخي أحمدwink.gif

post-256536-085909200 1346762926_thumb.p

يبدو أننا خُدعنا ..laugh.giflaugh.giflaugh.giflaugh.gifأمزح فقط ... أنا من جهتي ليس عندي مشكلة إن أردت وضع الحلقة الثانية اليوم أو غداً ... المهم أن يبقى الراوتر مفتوحا wink.gif

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

@مصطفى

النص الأصلي للتمرين يقول :

اكتب دالة تستقبل عدد صحيح موجب كوسيط و تعيد أصغر عدد صحيح يمكن توليده من الرقم الأصلي.

و بالتالي, أنت بإدخالك -12 تكون قد خالفتَ الــ Preconditions :)

مع ذلك, يمكن للكود أن يدعم الأعداد السالبة بمجرد حذف الــ unsigned, انظر :

post-219439-040533100 1346764196_thumb.p

بالنسبة لظهور الأصفار أمام العدد, فالطريقة الثانية ستحل المشكلة, مع أن السؤال الأصلي ينص على أن العدد موجب.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أهلا أخ biginner2000

عندي لك ملاحظة بسيطة فيما يخص هذا السطر من الكود أتمنى أن تنتبه لفخاخ الحجز حتى لا تقع في خطأ Fuite de mémoire



alloc.str =(char *) realloc(alloc.str, sizeof(char) * alloc.size);

قبل استدعاء الدالة realloc المؤشر alloc.str يؤشر على zone valide في الذاكرة

إذا سبق و استدعينا إحدى دالتي الحجز الديناميكي calloc أو malloc .

ماذا لو فشلنا في إعادة الحجز realloc؟

عندها الدالة realloc سترجع NULL كقيمة توضع داخل المؤشر alloc.str

alloc.str =NULL;

ولكن realloc لا زالت تحتفظ بال bloc mémoire المحجوز سابقا

huh.gif

هذا يعني أن أن ال bloc mémoire لم يحرر بعد ph34r.gif

وعندما يأخد المؤشر alloc.str قيمة NULL نفقد عنوان zone في الذاكرةwink.gif

وبالتالي فهذا يدل على أن هناك zone محجوزة في الذاكرة وغير مستعملة ولايمكن تحريرها لأننا فقدنا عنوانها بإعطائنا للمؤشر alloc.str القيمة NULL

لمعالجة هذه المشكلة يلزمك تهييئ مؤشرين ptr و ptr_realloc مثلا ونعطي للمؤشر ptr_realloc كقيمة (القيمة المرجعة من الدالة realloc )

ومن بعدها نقارن هذه القيمة ب NULL إذا كانت تخالفها نضع تلك القيمة داخل المؤشر ptr

انظر المثال حتى تفهم أكثر ما أقصده

void* realloc_securise (void **ptr, size_t taille)
{
void *ptr_realloc = realloc(*ptr, taille);

if (ptr_realloc != NULL)
*ptr = ptr_realloc;
/* ......... */
/* إذافشلت في إعادة الحجز ptr هنا تقوم بوضع ما يناسبك من الأوامر مثلا أن توم بتحرير*/

return ptr_realloc;
}

وفقك الله

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

شكرا لك أخ مومو على الملاحظة هاهي الدالة بعد التعديل

allocVar allocation()
{
allocVar alloc;
char c = 0;
char * tmp_ptr = NULL;

alloc.size = 1;

while((c = getchar()) != '\n')
{
alloc.size++;

tmp_ptr =(char *) realloc(tmp_ptr, sizeof(char) * alloc.size);

if(tmp_ptr != NULL)
{
alloc.str = tmp_ptr;
}
else
{
free(alloc.str);
printf("Allocation fialled in allocation function!\n");
exit(0);

}
alloc.str[alloc.size - 2] = c;
}
alloc.str[alloc.size - 1] = '\0';

return alloc;
}

وفقك الله

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

تم اعتماد الردود المفيدة و حذف الردود الغير مفيدة حفاظا على تنسيق الموضوع.

أعتذر لجميع الإخوة.

يُغلق.

أراكم في الحلقة الثانية.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .