Ошибка отладчика Netbeans 8.1 C?
Вот мой код, который преобразует шестнадцатеричное число (заданное в строке) в десятичное:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int val(char);
int main() {
char s[100];
int sum = 0, mult = 1,i,len;
printf("Hexadecimal number:\n");
fflush(stdout);
fgets(s,100,stdin);
len = strlen(s);
for (i = len-2; i >= 0; i--) {
sum += val(s[i])*mult;
mult *= 16;
}
printf("%d\n",sum);
fflush(stdout);
return (EXIT_SUCCESS);
}
int val(char c) {
switch(c) {
case '0': return 0;
case '1': return 1;
case '2': return 2;
case '3': return 3;
case '4': return 4;
case '5': return 5;
case '6': return 6;
case '7': return 7;
case '8': return 8;
case '9': return 9;
case 'a': return 10;
case 'b': return 11;
case 'c': return 12;
case 'd': return 13;
case 'e': return 14;
case 'f': return 15;
default: return -1;
}
}
1. Я добавляю точку останова к int sum = 0, mult = 1,i,len;
2. Я начинаю отладку
3. Я использую Step Into - переменные отображаются справа
4. Я вступил в printf("Hexadecimal number:\n");
а также fflush(stdout);
и это не отображается в консоли.
5. Стрелка рядом с fgets(s,100,stdin);
Я вступаю в
6. Я больше не могу использовать степперы, я предполагаю, что это тот момент, когда я должен передать строку в stdin.
7. Я пытаюсь дать строку, ничего не происходит, я могу дать ее снова, ничего не происходит.
Другой пример:
1. Я добавляю точку останова к len = strlen(s);
(после fgets
)
2. Я начинаю отладку
3. Тот же результат при входе в fgets
(предыдущий пример)
Программа работает нормально, если не отлаживается. Я пробовал Cygwin и MinGW тоже, тот же результат. Это ошибка или я что-то пропустил? Должен ли я сообщить об этом?
2 ответа
Существует обходной путь: в Project Properties
, под Run
Выбрать External Terminal
для Console Type
, (Это необходимо для MinGW.)
С Cygwin проблема заключалась в том, что Netbeans каким-то образом использовал 64-битную установку с выбранным 32-битным каталогом bin. После того, как я выбрал 64-битный каталог Cygwin bin в Options|C/C++|Build Tools
отладчик работал с Internal Terminal
варианты тоже.
я скучаю по чему-то
Да, когда ты step
в fgets
, ваша программа остановлена (и, следовательно, не может принять любой ввод).
Что вы хотите сделать, это next
над fgets
, Это заблокирует программу при вводе. Как только вы введете свой номер, программа разблокируется и снова остановится из-за (временной) точки останова на следующей строке.
PS Ваша реализация val
можно заменить всего несколькими строками:
if ('0' <= c && c <= '9') return c - '0';
if ('a' <= c && c <= 'f') return c - 'a' + 10;
return -1;