[C语言]scanf函数的格式解析和输入匹配规则

一、scanf()函数的控制串 

其控制串由三类字符构成:

  1. 格式化说明符;
  2. 空白符;
  3. 非空白符;

格式化说明符

常用格式字符说明
%d当`scanf`碰到`%d`时,会尝试读取一个整数,遇到空格、制表符或换行符等空白字符时输入结束。
%f当`scanf`碰到`%f`时,会尝试读取一个浮点数(单精度浮点数),遇到空格、制表符或换行符等空白字符时输入结束。
%lf当`scanf`碰到`%lf`时,会尝试读取一个浮点数(双精度浮点数),遇到空格、制表符或换行符等空白字符时输入结束。
%c遇到`%c`时,`scanf`会读取一个字符,任何字符都会导致输入结束。
%s遇到`%s`时,`scanf`会读取一个字符串,遇到空格、制表符或换行符等空白字符时输入结束。
%[]
使用`%[]`格式控制符可以指定匹配的字符范围,也可以使用'^'来排除指定字符范围。
%%`%%`表示一个百分号字符

空白符

- 空格(' ')
- 换行符('\n')
- 回车符('\n')

非空白符

非空白符包括数字、字母、特殊符号以及其他可见字符,以下是一些非空白符的几个例子:
- 数字字符:'0'、'1'、'2'、...、'9'
- 大写字母:'A'、'B'、'C'、...、'Z'
- 小写字母:'a'、'b'、'c'、...、'z'
- 特殊符号:'!'、'@'、'#'、'%'、'&'、'*' 等
- 标点符号:','、'.'、'?'、'!' 等
- 括号:'()'、'[]'、'{}' 等

二、输入匹配规则

`scanf`函数按照格式控制符逐个匹配输入数据,严格要求匹配,但是空白符较为特殊(因为在C语言中,空格、制表符和换行符都被视为分隔输入的空白字符)。

例1:

#include <stdio.h>
int main(void)
{
  int a,b,c;
 
  scanf("%d%d%d",&a,&b,&c); 
  printf("%d,%d,%d/n",a,b,c); 

  return 0;
}  


      以下都是合法输入方式:
      ① 3□□4□□□□5↙
      ② 3↙
         4□5↙
      ③ 3(tab键)4↙
         5↙

......

例2:

#include <stdio.h>
int main(void)
{
  int a,b,c;
  scanf("%d,%d,%d",&a,&b,&c);
  printf("%d,%d,%d/n",a,b,c); 
  return 0;
} 

运行时按如下方式输入三个值:

3,4,5 ↙(输入a,b,c的值)

或者

3,□4,□5 ↙(输入a,b,c的值)

3,□□□4,□5 ↙(输入a,b,c的值)
......
都是合法的,但是","一定要跟在数字后面,如:
3□,4,□5 ↙就非法了,程序出错。

三、输入结束说明

遇到`%c`时,`scanf`会读取一个字符,任何字符都会导致输入结束。

例:

#include<stdio.h>
int main()
{
	char c1, c2, c3;
	scanf("%c%c%c", &c1, &c2, &c3);
	printf("%c %c %c", c1, c2, c3);
	return 0;
}



输入:a□b□c↙
结果:a→c1,□→c2,b→c3 (其余被丢弃)

原因:在用"%c"输入时,空格和“转义字符”均作为有效字符。

遇到`%s`时,`scanf`会读取一个字符串,遇到空格、制表符或换行符等空白字符时输入结束。 

例 :

#include <stdio.h>
int main()
{
    char str[80];
   
    scanf("%s",str);
    printf("%s",str);

    return 0;
}

输入:I love you!
输出:I

四、使用'%%'  '%[]'代码举例

1.%%的使用

#include <stdio.h>

 int main() {
    float percentage1,percentage2;

    // 从用户输入中读取百分比值,并保留百分号符号
    printf("请输入百分比值(包括百分号符号):");
    scanf("%f%% %f%%", &percentage1,&percentage2);

    // 输出读取到的百分比值
    printf("读取的百分比值为: %.2f%% %.2f%%\n", percentage1,percentage2);

    return 0;
}

2.%[]的使用

#include <stdio.h>
int main() {
    char str[80];
    scanf(" %[^\n]", str); // 读取直到遇到换行符的所有字符
    printf("%s\n", str);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值