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

من رقم الى نص itoa

بدأه MOHAMED FATHEI في 26 فبراير 2011 · 6 رد · 731 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

قابلت سؤال عن كتابة دالة تستقبل رقم integer ومصفوفة حروف char array وتعيد مؤشر الى حرف char pointer

تقوم بتحويل الرقم الى نص وتخزنه فى المصفوفة الحرفية

فكتبت الكود التالى

// test.cpp

#include <iostream>
using std::cout;
using std::endl;

char* itoa(int i,char b[]);

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

    char b[9];

    cout << itoa(argc,b) << endl;

    return EXIT_SUCCESS;
}

// accept decimal,octal,hexadecimal put print as decimal
char* itoa(int i,char b[]){

    bool print = false;
    int base = 100000000;
    int res = 0;
    int index = 0;

    do{  
        res = i / base;
        if(res) print = true; // once only
        if(print) b[index++] = res + '0';
        i %=  base;
        base /= 10;
    }while(base > 0);

    b[index] = '\0'; // terminate the char array

    return b;

}

اظنها تقوم بالمطلوب مع خبرتى القليلة طبعا

لكن احس ان هناك حل افضل

ملحوظة :

اعرف انه يمكننى التحويل الى نص باستخدام ostringstream ولكن لا اريد هذه الطريقة (على الاقل الان)

بانتظار مقترحاتكم

شكرا

تم تعديل هذه المشاركة بواسطة MOHAMED FATHEI في 26 فبراير 2011 في 12:23

1


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#2

الافضل انك تستعمل sprintf

طبعا هذه عينه صغيره من الكود ويعمل بالشكل المطلوب ان كنت فهمت ما اردت بشكل دقيق

char* itoa(int b[] , int i)
{
sprintf(b,"%d",i);

return b;

}
2

Be Happy

^_^

#3

فعلا اخى طريقة رائعة وتفى بالغرض

وشكرا لمرورك

هل ترى من احتمالات خطأ فى الشفرة السابقة ؟


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#4

نعم،

وذلك بسبب نوع الداله char* وانت تمرر char* وهو int* بالاساس ، كتبت الكود لاوضح الفكره بشكل سريع لكن الكود الذي يفي بالغرض هو كالتالي:

هذا الكود امن اكثر من قبل

#include <stdio.h>

int itoa(char arr[], int* logicSize  ,int arrSize, int number);

int getNumberLen(int num);

int main()
{
  char str[10];
  int logicSize;

  itoa(str, &logicSize , 10, 0xff);

  printf("%s\n",str);

  return 0;
}


int itoa(char arr[], int* logicSize ,int arrSize, int number)
{
  int numLen = getNumberLen(number);

  if ( numLen > arrSize )
	return 0;

  sprintf(arr,"%d",number);

  *logicSize = numLen;

  return 1;

}

int getNumberLen(int num)
{
  int len = 0;

  while (num)
  {
	num/=10;
	len++;
  }

  return len;
}

تم تعديل هذه المشاركة بواسطة openSUSE في 28 فبراير 2011 في 17:12

1

Be Happy

^_^

#5

الكود السابق c بحت ! ، هذا الكود يميل للسي ++ اكثر

#include <iostream>
#include <stdio.h>

using namespace std;

int itoa(char arr[], int& logicSize  ,int arrSize, int number);

int getNumberLen(int num);


int main()
{
  char str[10];
  int logicSize;

  itoa(str, logicSize , 10, 0xff);

  cout << str << endl;


  return 0;
}



int itoa(char arr[], int& logicSize ,int arrSize, int number)
{
  int numLen = getNumberLen(number);

  if ( numLen > arrSize )
	return 0;

  sprintf(arr,"%d",number);

  logicSize = numLen;

  return 1;

}

int getNumberLen(int num)
{
  int len = 0;

  while (num)
  {
	num/=10;
	len++;
  }

  return len;
}
1

Be Happy

^_^

#6

من الـRTL الخاص بـNT بتصرّف :

bool IntegerToChar(unsigned long Value, unsigned long OutputLength, char *String)
{
	char Result[33], *s;
	char IntegerChars[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
	unsigned long Digit, Length;


	s = &Result[32];
	*s = '\0';
	do {
    	Digit = Value % 10;
    	Value = Value / 10;

    	*--s = IntegerChars[Digit];
	} while (Value != 0);

	Length = (unsigned long)(&Result[32] - s);
	memmove(String, s, Length);
	if (Length < OutputLength)
	{
    	String[Length] = '\0';
	}

	return true;
}
1

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#7

شكرا لمروركم الكريم

استفدت منكم كتير

تحياتى


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

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