2013-09-20 5 views
-2

Я новичок в использовании fgets, поэтому не знаю, что я делаю неправильно. Мне нужно сделать таблицу с поплавками, но я сохраняю сегрегацию во время стандартного ввода. Я вынул весь «ненужный» код для удобочитаемости, поэтому да, я использую все аргументы в параметрах. Это приводит к сбоям даже при вводе одного номера.Ошибка сегментации в моем приложении C

typedef struct row 
{ 
    int column; 
    float value[20]; 
}ROW; 

//in main ROW table[100]; 

void makeTable2(ROW* table, int* row, int* column) 
{ 
    int counter = 0, counter2; 
    int y = 0; 

    char str[256], again; 

    printf("Enter in the table: "); 

    do{ 

     fgets(str, 256, stdin); 

     while(sscanf(str, "%f", &table[*row].value[y])) 
      y++; 

     (*row)++; 

     printf("Add another row? (y or n)? "); 
     scanf("%c", &again); 

    }while(again == 'y' || again == 'Y'); 
} 
+0

Показать свой 'main()' –

+0

Где вы выделяете память для ROW? Некоторый код, пожалуйста. –

+0

// в основной таблице ROW [100]; – juice

ответ

1

в строке

while(sscanf(str, "%f", &table[*row].value[y])) 

вы читаете свой первый номер каждый раз, а не в следующем, только первое, и получить переполнение буфера, когда у превышает значение, 20. Try зсапЕ() каждое значение отдельно ,

+0

поэтому sscanf не разбирает фэги? – juice

+0

анализирует, но не как чтение из буфера, значения readden не исчезают –

+0

add printf ("% d:% f \ r \ n", y, table [* row] .value [y]); в то время как тело цикла и посмотреть, что вы читаете только первое значение. –

0
while(sscanf(str, "%f", &table[*row].value[y])) 
    y++; 

Это бесконечный цикл. Вы всегда читаете из первого значения поплавка, присутствующего в буфере str, и, в конце концов, становитесь более 19, и возникает ошибка сегментации.

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