C语言指针代码异常:注释无关代码影响输出求助
输入缓冲区换行符导致的异常问题排查
嘿,我来帮你搞定这个指针学习路上的小坑~其实你的指针用法完全没问题,问题出在输入缓冲区的残留字符上,和指针半毛钱关系都没有!
问题根源解释
当你执行scanf("%d", &n)输入整数后,按下回车键确认输入——这个回车键对应的换行符\n会留在输入缓冲区里。接下来的scanf("%c", &ch)会直接读取这个残留的换行符,而不是等待你输入字符。所以后面输出的时候,ch实际是换行符,看起来就像是“输出异常”了。
而当你注释掉那两行printf和scanf后,没有了输入操作,自然不会触发这个缓冲区残留的问题,所以代码运行正常。
两种解决方案
这里给你两种简单的修复方法:
方法一:用getchar()清空缓冲区残留
在读取字符的scanf前面加一行getchar(),专门吃掉残留的换行符:
#include <stdio.h> #include <conio.h> void main() { int n, *ptr1; char ch, *ptr2; printf("Enter an integer\n"); scanf("%d", &n); printf("Enter any single alphabetic character\n"); getchar(); // 吃掉前面输入留下的换行符 scanf("%c", &ch); ptr1 = &n; ptr2 = &ch; printf("\nThe integer is %d and its pointer is %d in the address %d\n", n, *ptr1, ptr1); printf("\nThe character is %c and its pointer is %c in the address %d\n", ch, *ptr2, ptr2); }
方法二:在scanf格式串前加空格
修改读取字符的scanf格式为" %c"(注意前面的空格),这个空格会自动跳过所有空白字符(包括换行、空格、制表符):
#include <stdio.h> #include <conio.h> void main() { int n, *ptr1; char ch, *ptr2; printf("Enter an integer\n"); scanf("%d", &n); printf("Enter any single alphabetic character\n"); scanf(" %c", &ch); // 前面的空格跳过空白字符 ptr1 = &n; ptr2 = &ch; printf("\nThe integer is %d and its pointer is %d in the address %d\n", n, *ptr1, ptr1); printf("\nThe character is %c and its pointer is %c in the address %d\n", ch, *ptr2, ptr2); }
额外小提示
- 你的指针用法是完全正确的,
ptr1 = &n和ptr2 = &ch都是正确的取址操作,*ptr1和*ptr2也正确解引用了指针,所以不用怀疑指针的问题~ - 新手学习C语言时,输入缓冲区的残留问题是非常常见的坑,记住这个小细节以后就不会再踩啦!
内容的提问来源于stack exchange,提问作者Dr. Parthasarathy R
相关产品推荐
相关产品推荐

