C语言中gets和scanf的区别?
展开全部
gets会将输入回车前所有输入的内容取出来,存放到一个字符数组,包括空格/tab,无论这些内容被空格/tab分成了几段,gets都会将这行输入完完整整的放到数组中,通俗点说就是gets会取一行,读到换行为止。
scanf是格式化输入,如果只使用最简单的格式化字符串%s,那么scanf只会取一个单词,在输入流中遇到空格/tab/换行,就会结束。比如输入流中有"aa
bb
cc"的话,那么执行scanf("%s",
s),s的值就会是aa,再次执行这句话,s的值就是bb,第三次就是cc。scanf会从输入流中取多少怎么取,取决于格式化字符串,也就是scanf的第一个参数;而gets则肯定会取出完整的一行。也就是说在scanf中,换行符等同于空格/tab,但gets中,换行符为读取结束标志。
还有就是gets取出来的肯定是字符串,如果需要转其他类型,则需程序中手动判断;而sacnf就不一定了。
scanf是格式化输入,如果只使用最简单的格式化字符串%s,那么scanf只会取一个单词,在输入流中遇到空格/tab/换行,就会结束。比如输入流中有"aa
bb
cc"的话,那么执行scanf("%s",
s),s的值就会是aa,再次执行这句话,s的值就是bb,第三次就是cc。scanf会从输入流中取多少怎么取,取决于格式化字符串,也就是scanf的第一个参数;而gets则肯定会取出完整的一行。也就是说在scanf中,换行符等同于空格/tab,但gets中,换行符为读取结束标志。
还有就是gets取出来的肯定是字符串,如果需要转其他类型,则需程序中手动判断;而sacnf就不一定了。
展开全部
我忍不住说一下,
希望已经给出答案的同学们不要介意。
scanf("%s%f",
name[i],
&score);
如果你输入
“abc
1234”
(注意
引号不是输入的数据,只是为了方便阅读)
这个时候
name[i]会读取数据的,但是读取的数据遇到空格就视为读取结束。这样剩余下的数据就是
一个空格外加1234.
当score开始读取的时候,读到的第一个数据是一个空格,而不是希望的float类型的数据,因此整个缓冲区的流都乱了,所有的数据全部没有用处。
解决的办法就是在
%s与%f之间加上一个空格,就可以解决这个问题。
希望已经给出答案的同学们不要介意。
scanf("%s%f",
name[i],
&score);
如果你输入
“abc
1234”
(注意
引号不是输入的数据,只是为了方便阅读)
这个时候
name[i]会读取数据的,但是读取的数据遇到空格就视为读取结束。这样剩余下的数据就是
一个空格外加1234.
当score开始读取的时候,读到的第一个数据是一个空格,而不是希望的float类型的数据,因此整个缓冲区的流都乱了,所有的数据全部没有用处。
解决的办法就是在
%s与%f之间加上一个空格,就可以解决这个问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询