断点调试实例:
#include <stdio.h>
int main(void)
{
int sum = 0, i = 0;
char input[5];
while (1){
scanf("%s",input);
for(i = 0;input[i] != '\0'; i++)
sum = sum*10 + input[i] - '0';
printf("input=%d\n", sum);
}
return 0;
}
这个程序的作用是:首先从键盘读入一串数字存到字符数组input中,然后转换成整型存到sum中,然后打印出来,一直这样循环下去。scanf("%s", input);这个调用的功能是等待用户输入一个字符串并回车,scanf把其中第一段非空白(非空格、Tab、换行)的字符串保存到input数组中,并自动在末尾添加'\0'。接下来的循环从左到右扫描字符串并把每个数字累加到结果中,例如输入是"2345",则循环累加的过程是(((0*10+2)*10+3)*10+4)*10+5=2345。注意字符型的'2'要减去'0'的ASCII码才能转换成整数值2。下面编译运行程序看看有什么问题:
[zhangsan@localhost study-c]$ gcc -Wall -g gdb2.c -o gdb2
[zhangsan@localhost study-c]$ ./gdb2
123
input=123
345
input=123345
第一次是对的,第二次就不对。可是这个程序我们并没有忘了赋初值,不仅sum赋了初值,连不必赋初值的i都赋了初值。下面来调试:
[zhangsan@localhost study-c]$ gdb gdb2
GNU gdb (GDB) 7.6.1
Copyright (C) 2013 Free Software Foundation, Inc.
...
Reading symbols from /home/zhangsan/study-c/gdb2...done.
(gdb) start
Temporary breakpoint 1 at 0x40053c: file gdb2.c, line 6.
Starting program: /home/zhangsan/study-c/gdb2
Temporary breakpoint 1, main () at gdb2.c:6
6 int sum = 0, i = 0;
有了上一次的经验,sum被列为重点怀疑对象,我们可以用display命令使得每次停下来的时候都显示当前sum的值,然后继续往下走: