Netbeans 8.1 C 调试器错误?
Netbeans 8.1 C debugger bug?
这是我的代码,它将十六进制数(以字符串形式给出)转换为十进制数:
#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);
并且 not 出现在控制台。
5.箭头在旁边fgets(s,100,stdin);
我步入
6. 我不能再使用步进器了,我想这是我应该在标准输入中给出字符串的时刻。
7.我试着给字符串,没有反应,我可以再给,没有反应。
其他示例:
1.我在len = strlen(s);
上加了一个断点(在fgets
之后)
2.我开始调试
3. 进入 fgets
时结果相同(上例)
程序不调试的话运行正常。我也尝试了 Cygwin 和 MinGW,结果相同。这是一个错误还是我错过了什么?我应该举报吗?
do I miss somehing
是的:当您 step
进入 fgets
时,您的程序 已停止 (因此无法接受任何输入)。
你想做的是next
超过fgets
。这将阻止程序输入。输入号码后,程序将解除阻塞,并由于下一行的(临时)断点而再次停止。
P.S。您对 val
的实现只需几行即可替换:
if ('0' <= c && c <= '9') return c - '0';
if ('a' <= c && c <= 'f') return c - 'a' + 10;
return -1;
有一个解决方法:
在Project Properties
、Run
、select、External Terminal
下为Console Type
。 (这是 MinGW 所必需的。)
对于 Cygwin,问题是 Netbeans 以某种方式使用 64 位安装和 selected 32 位 bin 目录。在我 select 在 Options|C/C++|Build Tools
中编辑 64 位 Cygwin bin 目录后,调试器也在使用 Internal Terminal
选项。
这是我的代码,它将十六进制数(以字符串形式给出)转换为十进制数:
#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);
并且 not 出现在控制台。
5.箭头在旁边fgets(s,100,stdin);
我步入
6. 我不能再使用步进器了,我想这是我应该在标准输入中给出字符串的时刻。
7.我试着给字符串,没有反应,我可以再给,没有反应。
其他示例:
1.我在len = strlen(s);
上加了一个断点(在fgets
之后)
2.我开始调试
3. 进入 fgets
时结果相同(上例)
程序不调试的话运行正常。我也尝试了 Cygwin 和 MinGW,结果相同。这是一个错误还是我错过了什么?我应该举报吗?
do I miss somehing
是的:当您 step
进入 fgets
时,您的程序 已停止 (因此无法接受任何输入)。
你想做的是next
超过fgets
。这将阻止程序输入。输入号码后,程序将解除阻塞,并由于下一行的(临时)断点而再次停止。
P.S。您对 val
的实现只需几行即可替换:
if ('0' <= c && c <= '9') return c - '0';
if ('a' <= c && c <= 'f') return c - 'a' + 10;
return -1;
有一个解决方法:
在Project Properties
、Run
、select、External Terminal
下为Console Type
。 (这是 MinGW 所必需的。)
对于 Cygwin,问题是 Netbeans 以某种方式使用 64 位安装和 selected 32 位 bin 目录。在我 select 在 Options|C/C++|Build Tools
中编辑 64 位 Cygwin bin 目录后,调试器也在使用 Internal Terminal
选项。