c语言中的%s到底应该怎么使用?大一新生求引导

ahahulahula 2016-12-12 09:00:38
百度上说的是%s输入完了之后会有一个回车,回车会留在缓冲区内,当下一次再次输入字符的时候这个回车会进入str这个数组,scanf("%s",str);所以网上说要加上一个getchar();来吸收这个回车,但是我们在做题的时候当scanf("%s",str);scanf("%s",str);两个scanf并排着的时候是对的,也就是回车并没有进入第二个%s,然后刚才刚才我们老师说scanf("%d",&a);之后如果要输入字符,那么需要加上一个getchar();来吸收回车,但是刚才我在测试的时候并没有getchar();结果答案也是对的,请问各位朋友,这到底是怎么回事啊??%s这个神奇的东西到底应该怎么使用?
...全文
2765 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-12-13
  • 打赏
  • 举报
回复
在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
//请今后要用
int c;
scanf("%c",&c);
//时,都改为
char s[2];
int c;
scanf("%1s",s);
c=s[0];
ahahulahula 2016-12-13
  • 打赏
  • 举报
回复
引用 6 楼 小灸舞的回复:
比如你输入:4 然后按下回车
此时,输入缓冲区是4+回车符
你scanf %d只是把4读走了,而会遗留回车符
scanf %s和%d并不会单独读入一个输入缓冲区遗留的回车符来结束语句
而scanf %c却是可以的,此时才需要在之前加一句getchar()来读掉遗留的回车符
明白了,明白了,谢谢谢谢,太有用了
小灸舞 2016-12-13
  • 打赏
  • 举报
回复
比如你输入:4 然后按下回车
此时,输入缓冲区是4+回车符
你scanf %d只是把4读走了,而会遗留回车符
scanf %s和%d并不会单独读入一个输入缓冲区遗留的回车符来结束语句
而scanf %c却是可以的,此时才需要在之前加一句getchar()来读掉遗留的回车符
ahahulahula 2016-12-13
  • 打赏
  • 举报
回复
引用 5 楼 qq_36409192的回复:
http://bbs.csdn.net/topics/350097500?locationNum=4&fps=1 楼主可以看看这个。。
谢谢,大家都很热情啊
ahahulahula 2016-12-13
  • 打赏
  • 举报
回复
引用 4 楼 paschen的回复:

	char str[100];
	char c;
	scanf("%s",str);
	scanf("%c",&c);
输入完后\n是留在缓冲区,你可以用上面代码验证
对,谢谢,感觉明白了许多
SK_AJIE 2016-12-13
  • 打赏
  • 举报
回复
引用 9 楼 ahahulahula 的回复:
[quote=引用 8 楼 赵4老师的回复:]在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
//请今后要用
int c;
scanf("%c",&c);
//时,都改为
char s[2];
int c;
scanf("%1s",s);
c=s[0];
不带\n的printf?难道printf打出的回车会被scanf读进去?[/quote] \n会强制刷缓冲区,在不带‘\n’的printf()后使用fflush(stdout)的作用是立刻将要输出的内容输出
ahahulahula 2016-12-13
  • 打赏
  • 举报
回复
引用 8 楼 赵4老师的回复:
在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
//请今后要用
int c;
scanf("%c",&c);
//时,都改为
char s[2];
int c;
scanf("%1s",s);
c=s[0];
不带\n的printf?难道printf打出的回车会被scanf读进去?
ck2333 2016-12-12
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/350097500?locationNum=4&fps=1 楼主可以看看这个。。
paschen 2016-12-12
  • 打赏
  • 举报
回复

	char str[100];
	char c;
	scanf("%s",str);
	scanf("%c",&c);
输入完后\n是留在缓冲区,你可以用上面代码验证
ahahulahula 2016-12-12
  • 打赏
  • 举报
回复
引用 1 楼 ipqtjmqj的回复:
字符与字符串不同,读完整数后,再读字符%c,需要用getchar吸收掉回车,而%s会跳过回车
感觉好像明白了,而且你推荐的网站也不错,在此谢谢啦~
ipqtjmqj 2016-12-12
  • 打赏
  • 举报
回复
详细用法见cppreference
ipqtjmqj 2016-12-12
  • 打赏
  • 举报
回复
字符与字符串不同,读完整数后,再读字符%c,需要用getchar吸收掉回车,而%s会跳过回车

33,321

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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