GDB调试时字符输入无效,其他数据类型输入正常问题求助
问题分析与解决:GDB调试时字符输入未被识别
嘿,这是用scanf处理混合类型输入时的经典陷阱!我来帮你捋清楚问题出在哪:
问题根源
当你用scanf("%d", &n)输入整数后,你按下的回车键(也就是\n字符)会留在输入缓冲区里。接下来的scanf("%c", &c)会直接读取这个残留的换行符,瞬间触发if(c=='\n') break;的条件,循环直接跳出——根本没机会读取你后续输入的字符,所以看起来像是字符输入没被程序识别。
从你提到的调试截图能看到:程序执行到scanf("%c", &c)这一行时,直接捕获到了换行符,循环随即终止,数组a里的元素都是未初始化的垃圾值,打印出来就是一堆乱数。
两种解决方案
方案1:用getchar()吃掉残留换行
在读取整数后,手动调用getchar()把缓冲区里的换行符消耗掉:
#include<stdio.h> int main() { int n,i=0; char c; scanf("%d",&n); getchar(); // 吃掉输入n后留下的换行符 int a[20]; while(1) { scanf("%c",&c); if(c=='\n') break; else { if(c!=32) a[i++]=c-48; } } for(i=0;i<10;i++) printf("%d ",a[i]); return 0; }
方案2:在scanf格式串前加空格(更通用)
在%c前面加一个空格,scanf会自动跳过所有前置的空白字符(包括换行、空格、制表符),直到读到第一个非空白字符:
#include<stdio.h> int main() { int n,i=0; char c; scanf("%d",&n); int a[20]; while(1) { scanf(" %c",&c); // %c前的空格会跳过所有空白字符 if(c=='\n') break; else { if(c!=32) a[i++]=c-48; } } for(i=0;i<10;i++) printf("%d ",a[i]); return 0; }
这个方法更灵活,哪怕输入里有多个空格或换行,都能正确读取目标字符。
内容的提问来源于stack exchange,提问作者user7011329
相关产品推荐
相关产品推荐

