2015-09-11 2 views
-1

Я написал программу, чтобы попытаться распечатать 2D-таблицу, содержащую графическое представление пользовательского ввода, используя 2D-массив в C. Я компилирую и запускаю эту программу, но не важно, как много я нажимаю Return или Ctrl + D для EOF, getchar по-видимому, не соответствует инструкциям в цикле, как ожидалось. Что я здесь делаю неправильно?Почему нет выхода getchar?

int main() 
{ 
    /*ignore these comments, they are outdated todo lists*/ 
    /* make vars init here, change for to while */ 
    /* finish printing */ 
    int c; 
    int i, sec, other; 
    char ndigit[3][8]; 

    while((c = getchar()) != EOF) { 
     if (c == '\n' || '\t' || ' ') { 
      for(i = 0; i < 63; ndigit[1][i] += 1); 
       ; 
     } 
     else if (c >= '0' || c <= '9') { 
      for(sec = 0; sec < 63; ndigit[2][sec] += 1) 
       ; 
     } 
     else 
      for(other = 0; other < 63; ndigit[3][other] += 1) 
       ; 
    } 
    for (i = 0; i <= 3; ++i) 
     for (sec = 0; sec <= 8; sec++) 
      printf("%s\n", ndigit[i][sec]); 
} 
+2

1) 'c == '\ n' || '\ t' || «Всегда верно». 2) заменить переменную индекса. 3) за пределами. – BLUEPIXY

+1

Почему имя Джона Доу? Я приглашаю вас зарегистрироваться на Stack Overflow с вашей реальной личностью (и каким-то образом присоединиться к вам). –

ответ

1

Compile со всеми предупреждениями & отладочной информации (gcc -Wall -Wextra -g, в частности, на Linux, которые я рекомендую для начинающих и экспертов). Вероятно, вы получите много полезных предупреждений от вашего компилятора (если возможно, используйте последнюю версию GCC, так как GCC улучшает свою диагностику с течением времени ....). Улучшите свой код, пока не получите никаких предупреждений. Затем используйте отладчик (gdb), в особенности для выполнения вашей программы шаг за шагом. Возможно, добавьте отладочные отпечатки. Вас также может заинтересовать также valgrind и address sanitizer.

Обратите внимание, что в:

for(other = 0; other < 63; ndigit[3][other] += 1); 

other не меняется (возможно, забыл об other++, и тогда вы получите buffer overflow если вы добавите его, потому что ndigit[я][J] марки только для 0 < = i < 3 и 0 < = j); поэтому у вас есть бесконечный цикл.

A buffer overflow - это один из способов иметь undefined behavior (UB). Вы должны be очень испугался UB и очень много работать, чтобы избежать UB. Here Я объясняю, почему.

+0

Вы были правы, я забыл увеличивать переменные, и я действительно получил segfault после добавления приращения к циклу. Однако я смущен тем, почему у меня есть segfault, когда у меня были другие <63 в условиях цикла. Как это возможно? –