c语言scanf函数

问题:scanf()函数不能正确接受有空格的字符串?如: I love you!

#include <stdio.h>
int main()
{
      char str[80];
    
      scanf("%s",str);
      printf("%s",str);
      return 0;
}
输入:I live you!
输出:I
         scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。
          ① 遇空格、“回车”、“跳格”键。
          ② 遇宽度结束。
          ③ 遇非法输入。
所以,上述程序并不能达到预期目的,scanf()扫描到"I"后面的空格就认为对str的赋值结束,并忽略后面的"love you!".这里要注意是"love you!"还在键盘缓冲区(关于这个问题,网上我所见的说法都是如此,但是,我经过调试发现,其实这时缓冲区字符串首尾指针已经相等了,也就是说缓冲区清空了,scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中)。我们改动一下上面的程序来验证一下:
#include <stdio.h>
int main()
{
      char str[80];
      char str1[80];
      char str2[80];
    
      scanf("%s",str);/*此处输入:I love you!    */
      printf("%s",str);
      sleep(5);/*这里等待5秒,告诉你程序运行到什么地方*/
      scanf("%s",str1);/*这两句无需你再输入,是对键盘盘缓冲区再扫描     */
      scanf("%s",str2);/*这两句无需你再输入,是对键盘盘缓冲区再扫描      */
      printf("n%s",str1);
      printf("n%s",str2);
      return 0;
}
输入:I love you!
输出:I
        love
        you!
好了,原因知道了,那么scanf()函数能不能完成这个任务?回答是:能!别忘了scanf()函数还有一个 %[] 格式控制符(如果对%[]不了解的请查看本文的上篇),请看下面的程序:
#include "stdio.h"
int main()
{
      char string[50];
    
       /*scanf("%s",string);不能接收空格符*/
       scanf("%[^\n]s",string);
       printf("%sn",string);
       return 0;
}

*************************************************************************************************

假如我想取一行字符,该怎么办?"%s"是不行的,因为%s遇到空白字符(空格、制表符、\r、\n)就结束了,所以可以写成 "%[^\n]%*c",%[^\n]的作用刚才讲过了,就是读\n之外的所有字符,也就是说读到\n为止,%*c的作用就是把\n去掉,否则再次读的时候一直遇到的都是\n;
所有对%s起作用的控制,都可以用于%[],比如"%*[^\n]%*c"就表示跳过一行,"%-20[^\n]"就表示读取\n前20个字符。

**************************************************************************************************************************************************

scanf是以空白符(空格、制表符、换行等等)为结束标志的,当遇到空白符是就会结束一次输入,如果你需要读取空格的话可以使用gets或者getchar 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值