2015-09-10 2 views
0

Так что я новичок в C, и я пытаюсь сделать прослушиватель, чтобы пользователь дважды нажимал клавишу ввода, чтобы завершить ввод ввода. Затем разделить на новую строку и запустить все данные через цикл и отправить их через мои функции.C token loop segfault issue

Я не уверен, что я делаю неправильно, но когда петля прямо под «//segfaulting в цикле» в коде закомментирована он работает нормально, но когда я раскомментировать его и мой призыв к «// assemble(ftemp);» прокомментировал это его является segfault, так что я знаю его здесь, просто не знаю, что. Вальгринд говорит ниже, если это вообще помогает.

Спасибо, что в Advanced Pete.

==14639== Invalid read of size 1 

==14639== at 0x4E7754C: ____strtod_l_internal (strtod_l.c:608) 

==14639== by 0x4011F8: main (in /home) 

==14639== Address 0x0 is not stack'd, malloc'd or (recently) free'd 

==14639== Process terminating with default action of signal 11 (SIGSEGV) 

==14639== Access not within mapped region at address 0x0 

==14639== at 0x4E7754C: ____strtod_l_internal (strtod_l.c:608) 

==14639== by 0x4011F8: main (in /home) 

==14639== If you believe this happened as a result of a stack 

==14639== overflow in your program's main thread (unlikely but 

==14639== possible), you can try to increase the size of the 

==14639== main thread stack using the --main-stacksize= flag. 

==14639== The main thread stack size used in this run was 8388608. 

==14639== HEAP SUMMARY: 

==14639==  in use at exit: 0 bytes in 0 blocks 

==14639== total heap usage: 0 allocs, 0 frees, 0 bytes allocated 

==14639== All heap blocks were freed -- no leaks are possible 

==14639== For counts of detected and suppressed errors, rerun with: -v 

==14639== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0) 

Мой код:

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

printf("Please Enter In Float (Hit Enter Twice To Exicute)\n"); 
#define MAXLENGTH 1000 
char Input_string[MAXLENGTH]; 
int ilop = 0; 
for(;;++ilop) 
{ 
    Input_string[ilop] = getchar(); 
    if (ilop > 0 && Input_string[ilop] == '\n' && 
Input_string[ilop-1] == '\n') break; 
} 
Input_string[ilop] = 0; 

char *pch; 
// printf ("Splitting string \"%s\" into tokens:\n",Input_string); 
pch = strtok (Input_string,"\n"); 
float ftemp = atof(pch); 
//printf("price:, %f\n\n",ftemp); 

assemble(ftemp); 
//segfaulting at loop 
while (pch != NULL) 
{ 
pch = strtok (NULL, "\n"); 
ftemp = atof(pch); 
    printf("price:, %f\n\n",ftemp); 
// assemble(ftemp); 
} 


return 0; 
} 
+3

Вы не проверяют 'pch' внутри цикла. Таким образом, это может быть (и в конечном итоге будет) NULL. –

+0

Первым шагом в исправлении будет форматирование вашего кода, чтобы вы могли его прочитать. – Sleafar

ответ

2

Чтобы расширить то, что сказал Игаль S., вы первый установка strtok внутри цикла, а затем использовать его, а не не проверяя его до верхней части петли , Итак, на последней итерации он установит pch в NULL, затем передаст его atof(), не проверив его.

Вам нужно что-то вроде (непроверенные):

pch = strtok (Input_string, "\n"); 
while (pch != NULL) 
{ 
    /* ... */ 
    pch = strtok (NULL, "\n"); 
} 
+0

Первый вызов должен быть 'pch = strtok (Input_string," \ n ");' –

+0

Ну, я сказал, что он не тестировался! Хороший улов, спасибо. – Davislor

2

Там есть возможность массива из связанного доступа, который может привести к непредсказуемому поведению.

В течение цикла в начале добавить чек

if(ilop > 999) 
{ 
    break; 
} 
+0

Постройте цикл 'for' правильно. –