scanf解决遇到空格停止问题
- gets
- 修改scanf的停止符
我们经常输入字符串的时候,遇到空格,scanf就会停止:
比如这时候我想输入一个句子:“My Love”:
char* s = (char*)malloc(sizeof(char)*100);scanf("%s", s);printf("%s\n", s);
这个时候我们有两种方法:一种是用gets,另一种方法是修改scanf的停止符:
gets
gets是从标准输入中提取字符串,以换行符为结束标志:
char* s = (char*)malloc(sizeof(char)*100);//scanf("%s", s);gets(s);printf("%s\n", s);
修改scanf的停止符
如果我们去查手册的话,会发现scnaf的手册有这么一个东西:
其实我们之前只是简单的使用了scanf并没有深入研究它究竟可以带哪些参数。在这里,我们找到这样的一行:
这里scanset我们称为扫描集,这里的brackets就是指这个方括号里面的东西,第一个方框里的意思就是,scanf只接受方括号里面的东西,其他的一律不会被接受,我们来看个例子:
char* s = (char*)malloc(sizeof(char)*100);scanf("%[My Beautiful girl]s", s);printf("%s\n", s);
这时候我输入girl:
因为我的扫描集里只有My Beautiful girl scanf只会将读到的字符串跟这个扫描集作比较,相符的就输出,不相符的就不输出。而且注意,如果字符串中有部分匹配就立刻停止检查,不会继续往后扫描:
char* s = (char*)malloc(sizeof(char)*100);scanf("%[MyBeautifulgirl]s", s);printf("%s\n", s);
说完了第一个框里的,第二个框里的就很容易理解了,第二个框里的就是不是方括号号里的scanf会接受,如果是就停止:
现在我将方括号里的扫描集取反:
char* s = (char*)malloc(sizeof(char)*100);scanf("%[^MyBeautifulgirl]s", s);printf("%s\n", s);
现在scanf只找不是方括号里的内容,所以会出现乱码的情况。
现在我们知道了原理,现在我们知道,我们默认的scanf的设置其实是这样的:
char* s = (char*)malloc(sizeof(char)*100);scanf("%[^ ]s", s);printf("%s\n", s);
scanf接收非空格的内容,如果是则停止:
现在我们想让scanf接收一个完整的可以带有空格的字符串,很简单:将扫描集中的内容改为非换行:
char* s = (char*)malloc(sizeof(char)*100);scanf("%[^\n]s", s);printf("%s\n", s);
现在scanf接收非\n的内容,遇到\n结束,我们的字符串就是以\n结束的:
这样就好啦~,注意一下这种方法适合于scanf家族,比如scanf,fscanf,sscanf等等。