针对c语言的scanf读取字符和字符串解析

scanf函数中,格式字符串里的空格字符有特定的作用。

当你在格式字符串里放置一个空格时,scanf会尝试匹配并消耗输入中的一个或多个空白字符(包括空格、制表符或换行符)。换句话说,它会跳过任何空白字符,直到找到下一个非空白字符。

例如,考虑以下代码:

c复制代码

int number; 
char character; 
scanf("%d %c", &number, &character);

如果用户输入1234 ascanf会首先读取1234并将其存储在number中。然后它会跳过空格,并读取字符'a',将其存储在character中。

格式字符串中的空格确保了在读取整数和字符之间有任意的空白字符被跳过。这为用户输入提供了一定的灵活性,因为他们可以在整数和字符之间自由地添加空格、制表符或换行符。

那么什么是空白字符呢

空白字符是指在屏幕上不会显示出来的字符,例如空格、制表符(tab)、回车、换行等。这些字符用于控制格式和布局,在文本处理中扮演着重要的角色。在C语言中,编译器在分析代码时会忽略空白字符,除非使用它们作为分隔符或作为字符常数或字符串文本元素。在输入时,例如使用scanf函数时,格式字符串中的空格会匹配并消耗输入中的一个或多个空白字符,为用户输入提供了一定的灵活性。

后期补充:

由于空格可以吸收任意多个空白字符,所以我们在输入字符时还有一点要注意,

如果是以下代码:

char a;
for(int b=0;b<3;b++){
	scanf("%c ",&a);
	cout<<a<<endl;
}

结果是:

我们可以看到,我们输入的是abc结果abc总是在我们输入下一个字符时才打印出来,这是因为“%c空格”会使得程序一直吸收空格,知道我们多输入一个数字时才会结束这个scanf

解决办法也好解决,我们只需把空格放前面,因为空格作用是吸收空白字符,我们输入的第一个字符肯不是空白字符,所以不会被吸收,在我们输入下一个字符时前一个字符遗留的空格就会被吸收。

for(int b=0;b<3;b++){
	scanf(" %c",&a);
	cout<<"输出的是"<<a<<endl;
}

当然啦,如果是文件读取,就不用在呼空格在前还是在后的问题了

好啦,知道这些前置知识可以开始我们的正式讲解啦

首先,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,而字符串的空格也接收到

  • 27
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值