PDA

View Full Version : اشاره گر به اشاره گر و آرایه



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 رو برابر با تمپ نابود شده قرار دادیم و میخواهیم چاپ کنیم! پس برنامه باید به مشکل بربخوره ( اشاره سرگردان) اما برنامه درست کار میکنه!!!!

hadi0x7c7
یک شنبه 06 مرداد 1392, 21:42 عصر
تابع شما رو نخوندم ولی خودم یه دونه مشابه اونو نوشتم که مطمعنم 100 در صد توی پیاده سازی اصلی هم از این خاصییت استفاده میشه (البته نمیدونم واقعن کار میکنه یا درست و بدون بگ هست یا نه):

#include <cstdio>
#include <iostream>

using namespace std;

double foo(const char* s, char **p) {

double ret = 0.0;
int n = 0;
sscanf(s, "%lf%n", &ret, &n);

if(p != NULL) {
(*p) = (char *)s + n;
}

return ret;
}

int main() {
char szOrbits[] = "365.24 29.53";
char* pEnd;
double d1, d2;
d1 = foo (szOrbits, &pEnd);
d2 = foo(pEnd, NULL);
printf ("The moon completes %.2f orbits per Earth year.\n", d1/d2);
return 0;
}

منبع مثال : http://www.cplusplus.com/reference/cstdlib/strtod/