c语言缓冲区问题,求解

w15234491291 2017-10-16 12:12:36
这是第一段代码(错误/不可行):
#include<stdio.h>
int main(void)
{
int a;
char b;
printf("shuzi:");
scanf("%d", &a);

scanf("%*[^\n]%*c");

printf("zimu:");
scanf("%c",&b);
printf("a = %d, b = %c", a,b);

return 0;
}


这是第二段代码(正确/可行):
#include<stdio.h>
int main(void)
{
int a;
char b;
printf("shuzi:");
scanf("%d", &a);

scanf("%*[^\n]");
scanf("%*c");

printf("zimu:");
scanf("%c",&b);
printf("a = %d, b = %c", a,b);

return 0;
}



问题:第一段代码scanf("%*[^\n]%*c"); 合在一起结果不行
第二段代码scanf("%*[^\n]"); scanf("%*c"); 分开写就可以了

为什么合在一起不行,求解释
...全文
146 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-10-16
  • 打赏
  • 举报
回复
在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
//请今后要用
char c;
scanf("%c",&c);
//时,都改为
char s[2];
char c;
scanf("%1s",s);
c=s[0];
//自动跳过一个或多个空格或Tab字符或回车换行,读取下一个字符。
赵4老师 2017-10-16
  • 打赏
  • 举报
回复
提醒:scanf是开源的。 参考crt\src\input.c
自信男孩 2017-10-16
  • 打赏
  • 举报
回复
#include<stdio.h>
int main(void)
{
    int a;
    char b;
    printf("shuzi:");
    scanf("%d", &a);
     
    getchar();    /*接收换行符\n*/
     
    printf("zimu:");
    scanf("%c",&b);
    printf("a = %d, b = %c", a,b);
     
    return 0;
}

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧