You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:28:54