D_felfelak
یک شنبه 06 مرداد 1392, 07:06 صبح
strtod ( const char *nPtr , char **endPtr )
دز حال پیاده سازی تابع strtod کتابخانه cstdlib هستم این تابع رشته nptr رو به double تبدیل میکنه و endptr ادرس اشاره گری به باقیمانده رشته پس از عدد هستش
endptr باید به مکان اولین کاراکتر پس از مقدار تبدیل شده در داخل string اختصاص داده بشه
الان تبدیل رشته به عدد رو نوشتم با این endPtr مشکل دارم ( خطوط ۱۱ تا۲۲) اومدم با کلک و دور زنی endPtr رو به یه کپی از رشته اصلی تخصیص دادم دنبال روش اصلی و درستش هستم!
double MYstrtod ( const char *nptr , char **endPtr , int base = 10 )
{
int noqte ;
double resulet = 0;
int negahban = 0;
int i = 0;
if ( nptr[0] == '-')
i = 1;
for ( ; i < strlen(nptr); i++)
{
if (! (( nptr[i] >= '0' && nptr[i] <= '9' ) || nptr[i] == '.'))
{
char *temp = new char [ strlen(nptr) + 1 ];
int k = 0;
for (int j = i ; j < strlen(nptr); j++ , k++)
{
temp[k] = nptr[j];
}
temp[k ] = '\0';
*endPtr = temp;
break;
}
if (nptr[i] == '.')
{
noqte = i;
negahban++;
}
}
if ( negahban != 1)
return 0;
if ( nptr[0] == '-')
{
for (int i = noqte - 1 , j = 1; i > 0; i-- , j *= 10)
resulet += (nptr[i] - '0' ) * j ;
}
else
{
for (int i = noqte - 1 , j = 1; i >= 0; i-- , j *= 10)
resulet += (nptr[i] - '0' ) * j ;
}
double j = 0.1;
for (int i = noqte + 1 ; i < strlen(nptr); i++)
{
double temp = nptr[i] - '0';
resulet += temp * j ;
j *= .1;
}
//}
if (nptr[0] == '-')
{
return (resulet * -1);
}
return resulet;
}
یه سوال دیگه: فرض کنیم تابع در مین به صورت زیر فراخونی شده:
cout << '\n' << MYstrtod("-123123AAbdwAAA" , &end);
cout << end;
الان تمپ متغیر محلی داخل تابع هست و بعد از اتمام تابع نابود میشه پس وقتی از تابع بیرون میایم وجود نداره از طرفی اشاره گر end رو برابر با تمپ نابود شده قرار دادیم و میخواهیم چاپ کنیم! پس برنامه باید به مشکل بربخوره ( اشاره سرگردان) اما برنامه درست کار میکنه!!!!
دز حال پیاده سازی تابع strtod کتابخانه cstdlib هستم این تابع رشته nptr رو به double تبدیل میکنه و endptr ادرس اشاره گری به باقیمانده رشته پس از عدد هستش
endptr باید به مکان اولین کاراکتر پس از مقدار تبدیل شده در داخل string اختصاص داده بشه
الان تبدیل رشته به عدد رو نوشتم با این endPtr مشکل دارم ( خطوط ۱۱ تا۲۲) اومدم با کلک و دور زنی endPtr رو به یه کپی از رشته اصلی تخصیص دادم دنبال روش اصلی و درستش هستم!
double MYstrtod ( const char *nptr , char **endPtr , int base = 10 )
{
int noqte ;
double resulet = 0;
int negahban = 0;
int i = 0;
if ( nptr[0] == '-')
i = 1;
for ( ; i < strlen(nptr); i++)
{
if (! (( nptr[i] >= '0' && nptr[i] <= '9' ) || nptr[i] == '.'))
{
char *temp = new char [ strlen(nptr) + 1 ];
int k = 0;
for (int j = i ; j < strlen(nptr); j++ , k++)
{
temp[k] = nptr[j];
}
temp[k ] = '\0';
*endPtr = temp;
break;
}
if (nptr[i] == '.')
{
noqte = i;
negahban++;
}
}
if ( negahban != 1)
return 0;
if ( nptr[0] == '-')
{
for (int i = noqte - 1 , j = 1; i > 0; i-- , j *= 10)
resulet += (nptr[i] - '0' ) * j ;
}
else
{
for (int i = noqte - 1 , j = 1; i >= 0; i-- , j *= 10)
resulet += (nptr[i] - '0' ) * j ;
}
double j = 0.1;
for (int i = noqte + 1 ; i < strlen(nptr); i++)
{
double temp = nptr[i] - '0';
resulet += temp * j ;
j *= .1;
}
//}
if (nptr[0] == '-')
{
return (resulet * -1);
}
return resulet;
}
یه سوال دیگه: فرض کنیم تابع در مین به صورت زیر فراخونی شده:
cout << '\n' << MYstrtod("-123123AAbdwAAA" , &end);
cout << end;
الان تمپ متغیر محلی داخل تابع هست و بعد از اتمام تابع نابود میشه پس وقتی از تابع بیرون میایم وجود نداره از طرفی اشاره گر end رو برابر با تمپ نابود شده قرار دادیم و میخواهیم چاپ کنیم! پس برنامه باید به مشکل بربخوره ( اشاره سرگردان) اما برنامه درست کار میکنه!!!!