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

[تنبيه - عنوان غير مناسب : ]char(كيف أحول الحرف إلى رقم)

بدأه nkernel في 5 سبتمبر 2012 · 4 رد · 493 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

int main()
{
char*p;
p=(char*)malloc(sizeof(char));
p="23"
printf("%c",p[0]+p[1]); 

}

كيف أجعل النتيجة المطبوعة 5 وليست 101

#2
printf("%d",(p[0]-48)+(p[1]-48));

تم تعديل هذه المشاركة بواسطة khatibe_30 في 5 سبتمبر 2012 في 23:47

[سبحان الله و بحمده, سبحان الله العظيم]

#3

الأخ الكريم/الأخت الكريمة

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

مرحباً بكم في منتدى الفريق العربي للبرمجة

نود تنبيهك أن العنوان غير مناسب.

الرجاء اختيار عنوان مناسب أكثر في مواضيعك القادمة، وهذا بمثابة إشعار للأهمية.

وفي حال التكرار سيتعرض موضوعك للإغلاق والحذف!!!

قواعد المشاركة

/index.php?showtopic=29343

شاكرين لكم حُسن تعاونكم

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#4
nkernel كتب:

السلام عليكم

int main()
{
char*p;
p=(char*)malloc(sizeof(char));
p="23"

أخطأت في الحجز

حجزت ل octet واحد في هذه الحالة سيكون ل '0/' بينما المفروض أن تحجز لثلاتة

p=(char*)malloc(2*sizeof(char)+1);

الخطأ الثاني في الدالة main

لم ترجع لها أي قيمة

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


int main()
{


/* ......*/


return 0;

}

بالنسبة لسؤالك

الطرية الأولى

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


int main()
{

int t=0;
char *p;
p=(char*)malloc(2*sizeof(char)+1);
p="23";
t=((*p)-48)+(*(p+1)-48);
printf("%d",t);
free(p);

return 0;

}

الطرية الثانية بتحويل النص لمتغير من نوع long مثلا

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


int main()
{

long t=0;
char *p=NULL,*q=NULL;
p=(char*)malloc(1*sizeof(char)+1);
q=(char*)malloc(1*sizeof(char)+1);
p="2";
q="3";
t=strtol(p,NULL,10)+ strtol(q,NULL,10) ;
printf("%ld",t);
free(p);
free(q);

return 0;

}

ولا تنسى أن تحرر الحجز عند الإنتهاء منه free()

وبالتوفيق

تم تعديل هذه المشاركة بواسطة مومو (momo) في 6 سبتمبر 2012 في 00:35

i love you mama

#5

أخي الكريم ...عندما تحجز مصفوفة محرفية (لتخزين الحروف ) .. فإنها ستقوم بتخزين الأرقام داخل علامات التنصيص على أنها حروف أيضاً ...

وهذا يعني أن الرقم واحد لن يخزن على أنه 1 ...

بل سيخزن كما يحدد جدول ASCII حيث يتم ترميز كل حرف برقم وفي جدول ASCII يرمز للحرف 1 بالرقم 49

وأؤكد على كلمة الحرف 1 لأنه ليس رقماً في هذه الحالة ...

هناك طريقة بسيطة تمكنك من تجنب التعامل مع جدول ASCII وهي القيام بالعملية الصحيحة تماماً التالية :

'1'-'0'

أي أنك ستطرح قيمة ASCII للحرف 1 من قيمة ASCII للحرف 0 وهذا سيعطيك الرقم 1 ...

وبذلك يمكن أن نكتب الكود كما يلي :

int main()
{
char p[]="23";
printf("%c",(p[0]-'0')+(p[1]-'0')+'0'); 
return 0;
}

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

ولكن هذه الطريقة التي استعملتها غير صحيحة دائماً ....فماذا لو أردت جمع الحرفين 5 و 6 ...

وكملاحظة أخيرة ... أنت سألت كيف أجعل الكود يطبع 5 وليس 101 في حين أن كودك يطبع حرف e وليس 101 لأنك استخدمت ...c% داخل printf

أؤكد على أن حل الأخ ياسين صحيحي تماما ....

والأخ مومو محق في ملاحظاته ... إلا أنني أظن أنك تستخدم VisualStudio6 لأن المترجم به لا يظهر خطأ عند عدم كتابة return 0 بل يظهر warning فقط ...

كما أن عدم حجز حجرة إضافية للمحرف الصفري ... لا تؤدي إلى حدوث runtime error ... فذلك غالباً ما يتم تجاوزه ... ولا أدري لماذا ...

بالتوفيق للجميع ...

تحياتي

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

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

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

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

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