2014-11-25 2 views
0

Я пытаюсь читать в N строк из двух столбцов float. Ниже приведен код, к которому я пришел, к сожалению, результат не тот, который я ожидал. Я считаю, что проблема может быть связана с плохим использованием указателя. Вход и вывод следуют за кодом.Видимая путаница с указателями, массивами и stdin

int main (void){ 
    int i = 0; 
    int initSize =10; 
    double *xptr = (double *)calloc(initSize, sizeof(double)); 
    double *yptr = (double *)calloc(initSize, sizeof(double)); 

    while((scanf(" %lf %lf", &xptr[i], &yptr[i])) != -1){ 
    i++; 
    if(i == initSize){ 
     initSize *=2; 
     double *xtemp = xptr; 
     double *ytemp = yptr; 
     xptr = (double *)calloc(initSize, sizeof(double)); 
     yptr = (double *)calloc(initSize, sizeof(double)); 
     memcpy(yptr, ytemp,sizeof(double)); 
     memcpy(xptr, xtemp,sizeof(double)); 
    } 
    printf("x = %lf y = %lf \n", xptr[i] , yptr[i]); 
    } 
} 

Вход:

-150.5 127 
-98.76453 0.901 
100.1  140.34 
128  59.08765  
0.0039 -.000256 
3.5  1.1 
1.54  1000.987 

выход:

x = 0.000000 y = 0.000000 
x = 0.000000 y = 0.000000 
x = 0.000000 y = 0.000000 
x = 0.000000 y = 0.000000 
x = 0.000000 y = 0.000000 
x = 0.000000 y = 0.000000 
x = 0.000000 y = 0.000000 
+0

Просто изменить 'Е ("х =% Lf у =% Lf \ N", xptr [I], yptr [I]);' в 'Е (" х =% Л.Ф. у =% Л.Ф. \ n ", xptr [i-1], yptr [i-1]);' –

+0

О, и вместо этого используйте 'realloc()'. –

ответ

2

Использование ваших указателей good.But i увеличивается перед печатью фактически считанное значение. Это можно сделать только с помощью 2 указателей, используя realloc(), как показано ниже.

int main (void){ 
    int i = 0,j; 
    double *temp; 
    double *xptr = malloc(sizeof(double)); 
    double *yptr = malloc(sizeof(double)); 

    while((scanf(" %lf %lf", &xptr[i], &yptr[i])) == 2){ 

     printf("x = %lf y = %lf \n", xptr[i] , yptr[i]); 
     temp = realloc(xptr,sizeof(double) * (i+2)); 
     if(temp == NULL) 
     { 
     printf("Memory allocation failed\n"); 
     break; 
     } 
     else 
     xptr = temp; 
     temp = realloc(yptr,sizeof(double) * (i+2)); 
     if(temp == NULL) 
     { 
     printf("Memory allocation failed\n"); 
     break; 
     } 
     else 
     yptr = temp; 
     i++; 
    } 
    printf("Out\n"); 
    for(j=0;j<i;j++) 
     printf("%lf %lf\n",xptr[j],yptr[j]); 
    free(xptr); 
    free(yptr); 
    return 0; 
} 
+0

ах большое спасибо ... даже не знал, что был realloc .. – CSnewb

+0

@CSnewb np рад помочь и узнать. :) – Gopi

Смежные вопросы