在scanf
函数中,格式字符串里的空格字符有特定的作用。
当你在格式字符串里放置一个空格时,scanf
会尝试匹配并消耗输入中的一个或多个空白字符(包括空格、制表符或换行符)。换句话说,它会跳过任何空白字符,直到找到下一个非空白字符。
例如,考虑以下代码:
c复制代码
int number;
char character;
scanf("%d %c", &number, &character);
如果用户输入1234 a
,scanf
会首先读取1234
并将其存储在number
中。然后它会跳过空格,并读取字符'a'
,将其存储在character
中。
格式字符串中的空格确保了在读取整数和字符之间有任意的空白字符被跳过。这为用户输入提供了一定的灵活性,因为他们可以在整数和字符之间自由地添加空格、制表符或换行符。
那么什么是空白字符呢
空白字符是指在屏幕上不会显示出来的字符,例如空格、制表符(tab)、回车、换行等。这些字符用于控制格式和布局,在文本处理中扮演着重要的角色。在C语言中,编译器在分析代码时会忽略空白字符,除非使用它们作为分隔符或作为字符常数或字符串文本元素。在输入时,例如使用scanf函数时,格式字符串中的空格会匹配并消耗输入中的一个或多个空白字符,为用户输入提供了一定的灵活性。
好啦,知道这些前置知识可以开始我们的正式讲解啦
首先,scanf只有%c可以单独吸收空格,回车等字符(记住是从输入缓冲区将这些字符拿出来),而其他格式字符例如%d,%s一遇到空格回车就会停止,而将空格回车留到输入缓冲区中。
int main(){//duqu();char a;char b;char c;scanf("%c%c%c",&a,&b,&c);printf("%c%c%c",a,b,c);return 0;
}
可以看到我们使用%c输入的是a空格b三个字符而%c全吸收了
int main(){//duqu();char a[20];char b;char c;scanf("%s",&a);printf("%c%c%c",a[0],a[1],a[2]);return 0;
}
当我们使用%s时遇到空格停止输入所以只有a
综上所述,如果以后读取文件,或者写入数字和字符混合的字符串,可以考虑两种方法
第一使用
void duqu(){FILE *fp;fp=fopen("E:\\数据结构实验\\aaa.txt","r");int a;char b;fscanf(fp,"%d ",&a);printf("%d\n",a);int c;for(c=0;c<3;c++){fscanf(fp,"%c %d ",&b,&a);printf("%c %d\n",b,a);}fclose(fp);
}
如图中读取文件一般使用%c和%d外加空格空过去我们不想读取的空字符和换行符
第二
直接使用%c读取换行或者制表表符或者回车
额外附加
如果想直接读取一个带空格的字符串也可以使用gets()这个函数,它可以把回车直接踢出缓存区并接受空格
验证:
int main(){//duqu();
char a[20];
char b;
//gets(a);
scanf("%s",&a);
b=getchar();
printf("%c%c%c\n",a[0],a[1],a[2]);
printf("%cA",b);return 0;
}
可以看到b字符接受的是回车,因为scanf遇到回车停止而回车字符仍然在输入缓冲区,所以getchar()就接受到了这个回车字符
int main(){//duqu();
char a[20];
char b;
gets(a);
//scanf("%s",&a);
b=getchar();
printf("%c%c%c\n",a[0],a[1],a[2]);
printf("%cA",b);return 0;
}
我们看使用gets()输入的字符串,可以发现比其上一个代码,这次我输入了整整两行,这是因为gets接收到了字符后,他直接把回车键提出输入缓冲区,导致缓冲区啥也没有,所以需要我们另外在输入一个子符,而可以看到b是收到字符w,而字符串的空格也接收到