scanf解决遇到空格停止问题

scanf解决遇到空格停止问题

  • gets
  • 修改scanf的停止符

我们经常输入字符串的时候,遇到空格,scanf就会停止:
比如这时候我想输入一个句子:“My Love”:

      char* s = (char*)malloc(sizeof(char)*100);
      scanf("%s", s);
	  printf("%s
", s);

在这里插入图片描述
这个时候我们有两种方法:一种是用gets,另一种方法是修改scanf的停止符

gets

在这里插入图片描述gets是从标准输入中提取字符串,以换行符为结束标志:

      char* s = (char*)malloc(sizeof(char)*100);
      //scanf("%s", s);
	  gets(s);
	  printf("%s
", s);

在这里插入图片描述

修改scanf的停止符

如果我们去查手册的话,会发现scnaf的手册有这么一个东西:
在这里插入图片描述其实我们之前只是简单的使用了scanf并没有深入研究它究竟可以带哪些参数。在这里,我们找到这样的一行:
在这里插入图片描述这里scanset我们称为扫描集,这里的brackets就是指这个方括号里面的东西,第一个方框里的意思就是,scanf只接受方括号里面的东西,其他的一律不会被接受,我们来看个例子:

      char* s = (char*)malloc(sizeof(char)*100);
      scanf("%[My Beautiful girl]s", s);
	  printf("%s
", s);

这时候我输入girl:

在这里插入图片描述因为我的扫描集里只有My Beautiful girl scanf只会将读到的字符串跟这个扫描集作比较,相符的就输出,不相符的就不输出。而且注意,如果字符串中有部分匹配就立刻停止检查,不会继续往后扫描:

      char* s = (char*)malloc(sizeof(char)*100);
      scanf("%[MyBeautifulgirl]s", s);
	  printf("%s
", s);

在这里插入图片描述
说完了第一个框里的,第二个框里的就很容易理解了,第二个框里的就是不是方括号号里的scanf会接受,如果是就停止
现在我将方括号里的扫描集取反:

      char* s = (char*)malloc(sizeof(char)*100);
      scanf("%[^MyBeautifulgirl]s", s);
	  printf("%s
", s);

在这里插入图片描述
现在scanf只找不是方括号里的内容,所以会出现乱码的情况。

现在我们知道了原理,现在我们知道,我们默认的scanf的设置其实是这样的:

      char* s = (char*)malloc(sizeof(char)*100);
      scanf("%[^ ]s", s);
	  printf("%s
", s);

scanf接收非空格的内容,如果是则停止:
在这里插入图片描述
现在我们想让scanf接收一个完整的可以带有空格的字符串,很简单:将扫描集中的内容改为非换行

      char* s = (char*)malloc(sizeof(char)*100);
      scanf("%[^
]s", s);
	  printf("%s
", s);

现在scanf接收非
的内容,遇到
结束,我们的字符串就是以
结束的:
在这里插入图片描述
这样就好啦~,注意一下这种方法适合于scanf家族,比如scanf,fscanf,sscanf等等。