调试一下c语言程序
自我感觉很久没写C语言了
getchar函数
1 | char a = getchar(); |
getchar函数是依次从缓冲区中取出字符来,会取走的!!
1 | nihao |
这一行1
2for (; scanf("%d", &nums[i]) != 0 && getchar() == ' '; ++i)
nums = (int*)realloc(nums, sizeof(int) * (i + 1)); //数组为非降序排列
这里会要求用户输入数据,用户输入的数据就是会存放在缓冲区内,然后之后scanf每次读一个数字,getchar紧随其后读一个字符,所以我们输入的时候必须是一个数字一个空格
1 | while (getchar() == '\n' || getchar() == EOF || getchar() == '\0'); |
之后把缓冲区的字符读干净
测试一下,如果我输入12 21\n
那么scanf读完21之后,getchar函数读\n
1 | 00D52466 je main+0DEh (0D524AEh) |
关键是这两条指令:
1 | 00D52472 call __RTC_CheckEsp (0D51357h) |
所以之后比较cmp eax 20h
就会跳出循环
之后进入那个while循环
1 | while (getchar() == '\n' || getchar() == EOF || getchar() == '\0'); |
此时缓冲区已经是空的了,所以会要求用户继续输入数据
我此时输入了 1\n
所以调用完getchar
函数之后eax存放了十六进制的49
那么第二个调用getchar
读取的结果就是0Ah
1 | 00D524C2 mov esi,esp |
继续。此时缓冲区已经空了
那么会要求用户继续输入
我又输入了一个换行符,很明显此时读取的结果非空,所以跳出while循环
1 | 00D524D8 call dword ptr [__imp__getchar (0D5F220h)] |
遇到的尴尬
如果要程序的健壮性,那么用户多输入一个空格就会出错,因为多输入一个空格程序就不知道后面那个是什么了,同时还涉及到getchar
函数清空缓冲区,那个while循环的写法确实很经典,但是就没有考虑过如果缓冲区本身就是空的呢?
我修改了一下原有的代码,加入了cin.peek
函数来帮助判断
1 | while (1) |