前言
在编写代码的过程中,我们常常会碰到需要输入带空格的字符串的问题,但常用的scanf函数却会在遍历到空白字符(如空格,\n等停止),令我们十分苦恼。所以这次让我们来介绍几种常见的方法以及对于过程中遇到问题的一些解释。
换行符
在介绍具体的方法之前,我们先介绍一下计算机是如何看待我们的输入的。
在我们输入完一行之后,我们会习惯性地按下回车。这时,计算机会把这个动作理解为输入一个换行符 \n ,这也是空白字符的一种,所以scanf在读到换行符之后就会停止输入。
在具体问题的操作中,是否读入换行符(换行符是否仍在缓冲区之中),如何去除换行符以避免不必要的影响等等对于我们解决问题十分关键,因此在下面一一作出解释。
fgets
fgets包含于stdio.h头文件
char *fgets(char *str, int n, FILE *stream);
如果读取成功,fgets会返回一个指向str的指针。如果读取失败,则会返回NULL。
fgets读取一整行的字符,包括行末的换行符\n。
如图,数组录入时会录入\n
那么如何简洁地去除这个\n呢
去除\n的方法
#include<stdio.h>
#include<string.h>
int main(){
char a[20]={0};
char b[20]={0};
fgets(a,20,stdin);
fgets(b,20,stdin);
char* temp1=strchr(a,'\n');
*temp1=0;
int temp2=strcspn(b,"\n");
b[temp2]=0;
return 0;
}
常见的两种方法分别是使用strchr(返回指向第一个目标字符的指针)和strcspn(返回A字符串中第一个B字符串的首字母的下标)实现。
scanf
scanf的读取规则
scanf会读取缓冲区里面规定的第一个数据,并跳过前面的空白符。
空白符是指空格,\n,\t等
以下输入前面的空格会被跳过
123
值得注意的是,%c会读取任何字符,无论是不是空白字符,如果想用%c并跳过空白字符,可以加一个空格,表示跳过空白字符。除了%c,其他类型会自动跳过前导空白字符。
scanf(" %c",&a);
另外,scanf不会读取后导空白字符,空白字符留在缓冲区中等待被读取。
因此,fgets在读取到\n时停止,如果scanf与fgets混用,则会发生未知错误,需要注意把换行符去掉。
如何实现呢?
scanf读取整行方法
scanf("%[^\n]%*c",a);
%[^\n]表示读取带\n时停止。
%*表示丢弃此次读取结果,%*c表示丢弃读取的下一个字符类输入。
这样就可以读取到\n前停止,并且去掉\n,不影响后续输入。
用getchar()读取\n有类似的效果。
缓冲区的概念
缓冲区一般是4096字节大小的区域,用来储存临时输入数据。全部输入的数据都会被储存到缓冲区。